使用多个索引对String []的ArrayList进行排序

时间:2016-02-12 11:06:41

标签: java arrays sorting arraylist

我在这里积极撰写问题的新手,虽然我已经使用过这个网站一段时间了。

我想按照词法顺序(=自然顺序?!)对ArrayList进行排序,具体取决于数组的前两个索引。目前,我使用了以下代码:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;

public class SortArrayList {

    public static void main(String[] args) {

        ArrayList<String[]> workingSet = new ArrayList<>();
        workingSet.add(new String[]{"MiningCorp", "2265 Betacity"});
        workingSet.add(new String[]{"MiningCorp", "6454 Iotacity"});
        workingSet.add(new String[]{"Arbiter", "3812 Gammacity"});
        workingSet.add(new String[]{"MiningCorp", "1234 Thetacity"});
        workingSet.add(new String[]{"Arbiter", "1812 Deltacity"});

        Comparator<String[]> staComp = new Comparator<String[]>() {

            @Override
            public int compare(String[] first, String[] second) {
                String composite1 = first[0] + " " + first[1];
                String composite2 = second[0] + " " + second[1];
                return composite1.compareTo(composite2);
            }
        };

        Collections.sort(workingSet, staComp);
        for(String[] arr : workingSet){
            System.out.println(Arrays.toString(arr));
        }


    }

}

这应该产生以下输出:

[Arbiter, 1812 Deltacity]
[Arbiter, 3812 Gammacity]
[MiningCorp, 1234 Thetacity]
[MiningCorp, 2265 Betacity]
[MiningCorp, 6454 Iotacity]

这正是我想要的。 使用预建方法有更优雅的方式吗?

如果我想按词法顺序按第一个数组条目进行排序,但是在这个组中我希望各个数组按逆词法顺序排序,该怎么办? 为此,我是否需要第二个比较器来首先对每个数组的第二个索引的条目进行预排序?

以下是我想要的例子:

[Arbiter, 3812 Gammacity]
[Arbiter, 1812 Deltacity]
[MiningCorp, 6454 Iotacity]
[MiningCorp, 2265 Betacity]
[MiningCorp, 1234 Thetacity]

3 个答案:

答案 0 :(得分:2)

  

如果我想按词法顺序按第一个数组条目进行排序,但是在这个组中我希望各个数组按逆词法顺序排序,该怎么办?

然后,您需要以不同方式实施Comparator

Comparator<String[]> secondComparator = new Comparator<String[]>() {
        @Override
        public int compare(String[] first, String[] second) {
            int compareFirstPart = first[0].compareTo(second[0]);
            if(compareFirstPart != 0)
                return compareFirstPart;
            else
                return second[1].compareTo(first[1]); // Inverse!
        }
    };

答案 1 :(得分:2)

如果java8是一个选项,那么我会使用thenComparing方法组合两个排序说明符。

使用reversed时,比较器的结果会颠倒。

示例代码:

// turn your list into a stream
workingSet.stream()

// sort it...
.sorted(

    // first sort specifier: 0th element of Array
    Comparator.<String[], String>comparing(composite -> composite[0])

        // combine sort specifiers
        .thenComparing(

                // second sort specifier: 2st element of Array
                Comparator.<String[], String>comparing(composite -> composite[1])

                // REVERSED!
                .reversed()
        )
    )

// convert each array to a String
.map(Arrays::toString)

// print each String
.forEach(System.out::println);

答案 2 :(得分:1)

如果使用java 8,也可以使用lambda表达式:

Collections.sort(workingSet, (first, second) -> {
            int compareFirstPart = first[0].compareTo(second[0]);
            if(compareFirstPart != 0)
                return compareFirstPart;
            else
                return second[1].compareTo(first[1]); 
});