У меня есть следующий массив строк: «0 11», «22 34», «5 14», «22 13» ... Как мне отсортировать его, чтобы оба числа были в порядке возрастания: «0 11», «5 14 "," 22 13 "," 22 34 "?

0
Bozhidar Ganev 27 Ноя 2016 в 15:31

3 ответа

Лучший ответ

Вам просто нужно реализовать соответствующий Comparator. Как это:

public static void main(String[] args) {
    String [] ar = {"0 11", "22 34", "5 14", "22 13"};

    Arrays.sort(ar, new Comparator<String>() {
        @Override
        public int compare(String o1, String o2) {
            String [] value1 = o1.split(" ");
            String [] value2 = o2.split(" ");
            Integer o1First = Integer.valueOf(value1[0]);
            Integer o1Second = Integer.valueOf(value1[1]);
            Integer o2First = Integer.valueOf(value2[0]);
            Integer o2Second = Integer.valueOf(value2[1]);
            if (!o1First.equals(o2First))
                return o1First.compareTo(o2First);
            return o1Second.compareTo(o2Second);

        }
    });

    System.out.println(Arrays.toString(ar));
}
1
Grisha Weintraub 27 Ноя 2016 в 12:46

Чуть менее подробный:

Arrays.sort(ar, Comparator.comparingInt((String s) -> Integer.parseInt(s.split(" ")[0]))
                    .thenComparingInt((String s) -> Integer.parseInt(s.split(" ")[1])));

К сожалению, Java в настоящее время не имеет встроенной поддержки типов значений кортежей. В противном случае код мог бы быть короче.

0
Patrick Parker 27 Ноя 2016 в 17:20

Используйте Collections.sort(List, Comparator) Попробуйте это,

Collections.sort(yourList, new Comparator<String>() {
    @Override
    public int compare(String s1, String s2) {
        String[] split1 = s1.split(" ");
        String[] split2 = s2.split(" ");

        int n = split1[1].compareTo(split2[1]);

        if (n == 0) {
            return Integer.valueOf(split1[0]).compareTo(
                                  Integer.valueOf(split2[0]));
        }

        return n;
    }
});
0
Sachith 27 Ноя 2016 в 13:17