Я пытаюсь создать программу, состоящую из массива строк. теперь мне нужно отсортировать их по порядку «PJ», «GHS», «FJ», «PAS» и дате.
вход :
listOfStringArrays.add(new String[] { "200608", "FJ" });
listOfStringArrays.add(new String[] { "200608", "PJ" });
listOfStringArrays.add(new String[] { "200609", "FJ" });
listOfStringArrays.add(new String[] { "200609", "PJ" });
listOfStringArrays.add(new String[] { "200610", "FJ" });
listOfStringArrays.add(new String[] { "200610", "PJ" });
listOfStringArrays.add(new String[] { "200610", "PAS" });
listOfStringArrays.add(new String[] { "200610", "GHS" });
listOfStringArrays.add(new String[] { "200609", "SHO" });
listOfStringArrays.add(new String[] { "200615", "FIA" });
listOfStringArrays.add(new String[] { "200611", "GHS" });
listOfStringArrays.add(new String[] { "200615", "FIA" });
listOfStringArrays.add(new String[] { "200609", "PAS" });
listOfStringArrays.add(new String[] { "200607", "FIA" });
вывод:
//Всегда "PJ", "GHS", "FJ", затем "PAS"
listOfStringArrays.add(new String[] { "200607", "FIA" });
listOfStringArrays.add(new String[] { "200608", "PJ" });
listOfStringArrays.add(new String[] { "200608", "FJ" });
listOfStringArrays.add(new String[] { "200609", "PJ" });
listOfStringArrays.add(new String[] { "200609", "FJ" });
listOfStringArrays.add(new String[] { "200609", "PAS" });
listOfStringArrays.add(new String[] { "200609", "SHO" });
listOfStringArrays.add(new String[] { "200610", "PJ" });
listOfStringArrays.add(new String[] { "200610", "GHS" });
listOfStringArrays.add(new String[] { "200610", "FJ" });
listOfStringArrays.add(new String[] { "200610", "PAS" });
listOfStringArrays.add(new String[] { "200615", "FIA" });
Создайте правильный класс вместо использования String[]
для представления записи.
@ PM77-1 в первый раз я должен отсортировать их по дате, а затем по одному из четырех значений, если для одной даты у меня есть более одного из четырех значений, а затем отсортировать их по порядку «PJ», «GHS», «FJ» ,'ПАС'
Вам следует рассмотреть возможность использования пользовательских классов Java вместо массива строк. Найдите ниже пример, чтобы сделать это.
public static void main(String[] args) {
List<String[]> listOfStringArrays = getArrayOfStrings();
new SortArrayOfStrings().sort(listOfStringArrays);
listOfStringArrays.stream().forEach(s -> System.out.println(String.format("%s %s", s[0], s[1])));
}
private static List<String[]> getArrayOfStrings() {
List<String[]> listOfStringArrays = new LinkedList<>();
listOfStringArrays.add(new String[]{"200608", "FJ"});
listOfStringArrays.add(new String[]{"200608", "PJ"});
listOfStringArrays.add(new String[]{"200609", "FJ"});
listOfStringArrays.add(new String[]{"200609", "PJ"});
listOfStringArrays.add(new String[]{"200610", "FJ"});
listOfStringArrays.add(new String[]{"200610", "PJ"});
listOfStringArrays.add(new String[]{"200610", "PAS"});
listOfStringArrays.add(new String[]{"200610", "GHS"});
// listOfStringArrays.add(new String[]{"200609", "SHO"});
// listOfStringArrays.add(new String[]{"200615", "FIA"});
listOfStringArrays.add(new String[]{"200611", "GHS"});
// listOfStringArrays.add(new String[]{"200615", "FIA"});
listOfStringArrays.add(new String[]{"200609", "PAS"});
// listOfStringArrays.add(new String[]{"200607", "FIA"});
return listOfStringArrays;
}
private void sort(List<String[]> listOfStringArrays) {
Collections.sort(listOfStringArrays, new Comparator<>() {
@Override
public int compare(String[] o1, String[] o2) {
if (o1.length != 2 && o2.length != 2) {
throw new IllegalArgumentException("String array contains more than two values");
}
int comp = getValue(o1[1]).compareTo(getValue(o2[1]));
if (comp == 0) {
DateFormat df = new SimpleDateFormat("yyMMdd");
try {
return df.parse(o1[0]).compareTo(df.parse(o2[0]));
} catch (ParseException e) {
throw new IllegalArgumentException("Unable to parse date", e);
}
}
return comp;
}
});
}
public Integer getValue(String s) {
// TODO add FIA and SHO
List<String> values = Arrays.asList("PJ", "GHS", "FJ", "PAS");
for (int i = 0; i < values.size(); i++) {
if (values.get(i).equals(s)) {
return i;
}
}
return -1;
}
}
new SortArrayOfStrings().sort(listOfStringArrays);
чего вы ожидаете от этого?
Ах, извините, этот код был включен в класс под названием SortArrayOfStrings. Я только вставил тело класса :-). Он должен просто вызвать метод сортировки :-)
@codiallo спасибо, проблема в том, что в методе getValue я не могу добавить FIA и SHO, потому что это может быть много других значений ... и я должен упорядочить их по дате, а затем по строковым значениям
Я бы посоветовал вам действительно создать правильный класс, как было указано в одном из комментариев к вашему вопросу. По-прежнему можно отсортировать набор данных, используя вашу структуру, если это важно. Рассмотрим этот вопрос:
Как использовать Comparator в Java для сортировки
Если вы примените этот ответ к своему вопросу, вы можете получить:
Collections.sort(listOfStringArrays,new Comparator<String[]>(){
@Override
public int compare(final String[] lhs,String[] rhs) {
//TODO return 1 if rhs should be before lhs
// return -1 if lhs should be before rhs
// return 0 otherwise (meaning the order stays the same)
}
});
Как насчет любых значений, кроме четырех, которые вы выбрали? В вашем примере "ФИА" и "ШО"?