2

我有一个数组列表如下

100 AAA 500-1 Lorem Ipsum
100 BBB 500-2 Lorem Ipsum
101 AAA 500-1 Lorem Ipsum
101 AAA 500-2 Lorem Ipsum
100 BBB 500-3 Lorem Ipsum

我希望将其排序为

101 AAA 500-1 Lorem Ipsum
101 AAA 500-2 Lorem Ipsum
100 AAA 500-1 Lorem Ipsum
100 BBB 500-2 Lorem Ipsum
100 BBB 500-3 Lorem Ipsum

首先,按数字降序 (101, 100)。

二是按三个字母升序(AAA、BBB)。

三、按第三列升序(500-1、500-2、500-3)

我可以按空格分割每个元素并获取单个单词并进行排序。但是任何人都可以用任何其他方式或已知算法帮助我吗?如果您需要更多信息,请告诉我。

先感谢您。

4

3 回答 3

7

创建比较器将解决您的问题。你应该实现这样的东西:

public class MyComparator implements Comparator<MyObject> {    
  public int compare(MyObject o1, MyObject o2) {
    if (o1 == null || o2 == null) {
      throw new NullPointerException();
    }    
    if (o1.getValue1() != o2.getValue1()) {
      return Integer.compare(o1.getValue1(), o2.getValue1());
    }    
    return Integer.compare(o1.getValue2(), o2.getValue2());
  }
}

当然还有更多的方法可以解决这个问题,例如,您可以实现自己的排序算法。但是,我认为使用Comparator正确的“ java-way ”来解决它。

于 2013-05-03T12:33:22.117 回答
2

我假设你有一个Collectionof String

我将使用 Comparator 来解决它。

    List<String> myCollection = new ArrayList<String>();

    Collections.sort(myCollection, new Comparator<String>() {
        @Override
        public int compare(String o1, String o2) {
            // splitting it with space character
            String[] split1 = o1.split(" ");
            String[] split2 = o2.split(" ");

            int i1 = Integer.parseInt(split1[0]);
            int i2 = Integer.parseInt(split2[0]);

            int diff = (i2 - i1);

            if(diff != 0){ // if two integer are equal
                return diff;
            }else{
                return split2[1].compareTo(split1[1]);
            }
        }
    });
于 2013-05-03T12:47:25.860 回答
0

您需要为此实现一个Comparator,并将其传递给容器的 sort() 方法。

于 2013-05-03T12:35:56.487 回答