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) で降順します。

次に、3 文字ずつ昇順 (AAA、BBB)。

3 番目、3 列目で昇順 (500-1、500-2、500-3)

各要素をスペースで分割し、個々の単語と並べ替えを取得できます。しかし、誰か他の方法や既知のアルゴリズムで私を助けてもらえますか? さらに情報が必要な場合はお知らせください。

前もって感謝します。

4

3 に答える 3

7

Comparatorを作成すると、問題が解決します。次のようなものを実装する必要があります。

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

Collection私はあなたがのを持っていると仮定します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 に答える