Сортировка списка массивов строк в Java

Я пытаюсь создать программу, состоящую из массива строк. теперь мне нужно отсортировать их по порядку «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" });

Как насчет любых значений, кроме четырех, которые вы выбрали? В вашем примере "ФИА" и "ШО"?

PM 77-1 23.12.2020 17:30

Создайте правильный класс вместо использования String[] для представления записи.

chrylis -cautiouslyoptimistic- 23.12.2020 17:33

@ PM77-1 в первый раз я должен отсортировать их по дате, а затем по одному из четырех значений, если для одной даты у меня есть более одного из четырех значений, а затем отсортировать их по порядку «PJ», «GHS», «FJ» ,'ПАС'

Idir 23.12.2020 17:40
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
3
80
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вам следует рассмотреть возможность использования пользовательских классов 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); чего вы ожидаете от этого?
PM 77-1 23.12.2020 18:22

Ах, извините, этот код был включен в класс под названием SortArrayOfStrings. Я только вставил тело класса :-). Он должен просто вызвать метод сортировки :-)

codiallo 23.12.2020 18:23

@codiallo спасибо, проблема в том, что в методе getValue я не могу добавить FIA и SHO, потому что это может быть много других значений ... и я должен упорядочить их по дате, а затем по строковым значениям

Idir 23.12.2020 20:06

Я бы посоветовал вам действительно создать правильный класс, как было указано в одном из комментариев к вашему вопросу. По-прежнему можно отсортировать набор данных, используя вашу структуру, если это важно. Рассмотрим этот вопрос:

Как использовать 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)
     }
 });

Другие вопросы по теме