-3

リストからデータを並べ替えようとしています。リストのフィールドIDは次のとおりです。

field id :field_38637
field id :field_38469
field id :field_38468
field id :field_38638
field id :field_38637
field id :field_38469
field id :field_38468
field id :field_38468
field id :field_38469
field id :field_38468
field id :field_38637

リストデータのサイズは11です。上記のリストデータの場合、並べ替えを行っています。

    Collections.sort(copedppList, new Comparator() {

        @Override
        public int compare(Object o1, Object o2) {
            Field oo1 = (Field ) o1;
            Field oo2 = (Field ) o2;
        if(oo1.getFieldId()!=oo2.getFieldId()){}    
                    return 1;
                      else 
                         return 0;


    });


   for (int i = 0; i < copedppList.size(); i++) {

            Field pp = (Field) copedppList
                    .get(i);
            System.out.println(pp.getFieldID());
        }

並べ替えた後、リストを取得しています

field_38468
field_38468
field_38468
field_38468
field_38468
field_38469
field_38469
field_38469
field_38637
field_38637
field_38637

編集済み:同様のフィールドIDは並べ替え後にグループ化されますが、38637,38469,38468で始まる受信リストに従ってグループ化する必要があります。ここで何が問題になっていますか?受信リストの順序を維持したい。

4

2 に答える 2

7

コンパレータでソートするのではなく、等しいかどうかをチェックするだけです。これはおそらくうまくいくでしょう:

public int compare(Object o1, Object o2) {
    Field oo1 = (Field ) o1;
    Field oo2 = (Field ) o2;

    return oo1.getFieldID().compareTo(oo2.getFieldID());
}

(getFieldIDがnull以外の文字列であると想定します)

ps:ジェネリックを使用していないようです。コードからこれらのキャストをすべて削除できます。

編集

実際には、アイテムを並べ替えるのではなく、グループ化する必要があります。最も簡単な方法は、2つのリスト(テストされていない)を使用してそれを行うことです。

public static void main(String[] args) throws InterruptedException {
    List<Field> originalList = new ArrayList<Field>();
    originalList.add(new Field("field_38637"));
    originalList.add(new Field("field_38469"));
    originalList.add(new Field("field_38468"));
    originalList.add(new Field("field_38638"));
    originalList.add(new Field("field_38637"));
    originalList.add(new Field("field_38469"));
    originalList.add(new Field("field_38468"));
    originalList.add(new Field("field_38468"));
    originalList.add(new Field("field_38469"));
    originalList.add(new Field("field_38468"));
    originalList.add(new Field("field_38637"));

    System.out.println(originalList);
    List<Field> groupedList = new ArrayList<Field>(originalList.size());
    while (!originalList.isEmpty()) {
        String id = originalList.get(0).getFieldID();
        for (Iterator<Field> it = originalList.iterator(); it.hasNext();) {
            Field f = it.next();
            if (f.getFieldID().equals(id)) {
                it.remove();
                groupedList.add(f);
            }
        }
    }

    System.out.println(groupedList);
}

public static class Field {

    private final String fieldID;

    public Field(String fieldID) {
        this.fieldID = fieldID;
    }

    public String getFieldID() {
        return fieldID;
    }

    @Override
    public String toString() {
        return "Field{" + "fieldID=" + fieldID + '}';
    }
}        
于 2012-08-21T11:23:35.230 に答える
2

のドキュメントを読んでくださいcompare()a要素との関係に応じて、-1、0、または1のいずれかを返すことになっていますb。0または1のいずれかを返すだけなので、並べ替えは機能しません。

http://www.javapractices.com/topic/TopicAction.do?Id=10およびhttp://docs.oracle.com/javase/7/docs/api/java/util/Comparator.htmlを読んでみてください

試す

public int compare(Object o1, Object o2) 
{
  Field oo1 = (Field ) o1;
  Field oo2 = (Field ) o2;
  return oo1.getFieldID().compareTo(oo2.getFieldID());
}
于 2012-08-21T11:24:28.463 に答える