6

構造体の特定の要素に従って並べ替えたい構造体のリストがあります。

private class myStruct {

    public Boolean GUI;
    public float CallTime;
    public String ReqID;
    public String ReqGUID;
    public String Stereotype;
    public String StereotypeGUID;

}

private List<myStruct> DataList = new ArrayList<myStruct>();

ハードコーディングせずに、要素「ReqID」で DataList を並べ替えるにはどうすればよいですか? 使用する可能性はありますArrays.sort()か?

4

8 に答える 8

2

を使用する必要がありますComparator

 class YourComparator implements Comparator<myStruct>{

         public int compare(myStruct s1, myStruct s2){
              //here comes the comparison logic
         }
 }

次に、この形式のsort()メソッドを使用します。

 Arrays.sort(T[] arrayToSort, Comparator<T> yourComparator);

データ構造としてコレクションと配列のどちらを使用するかは明確ではありません。

リストを使用する場合は、 を使用しますCollections.sort()

于 2012-09-18T09:30:51.830 に答える
1

このようなコンパレータインターフェイスを使用します

public static void main(String[] args) {
    List<myStruct> DataList = new ArrayList<myStruct>();
    //ADD Objects to DataList here

    Collections.sort(DataList, new Comparator() {

        public int compare(Object o1, Object o2) {
            myStruct p1 = (myStruct) o1;
            myStruct p2 = (myStruct) o2;
            int ret = -1;
            //business logic here
            if (Integer.parseInt(p1.ReqGUID) == Integer.parseInt(p2.ReqGUID)) {
                ret = 0;
            } else if (Integer.parseInt(p1.ReqGUID) > Integer.parseInt(p2.ReqGUID)) {
                ret = 1;
            } else if (Integer.parseInt(p1.ReqGUID) < Integer.parseInt(p2.ReqGUID)) {
                ret = -1;
            }//end business logic
            return ret;
        }
    });

}

ここで、Collections.sort()メソッド内で、Comparatorインターフェースを実装し、compare()メソッドをオーバーライドしています。これにより、compare()メソッド内に実装したビジネスロジックに基づいてリストが実際に並べ替えられます。

于 2012-09-18T09:39:43.743 に答える
1

カスタムソートの場合、Comparableインターフェースを実装できます。

このインターフェイスを使用して、負の数または正の数compareTo()を返すメソッドを作成します。0戻りコードに基づいてCollections.sort()、要素が別の要素の前または後にある必要があるかどうかを判断できます。

それを使用する良い例は、この回答にあります: Java クラスは同等のものを実装します。

于 2012-09-18T09:31:16.223 に答える
1

あなたのクラス構造は私には奇妙に見えます.プライベートクラス内にパブリックフィールドがあります..理想的には、フィールドはプライベートとマークされるべきであり、それらにアクセスするためのゲッターとセッターを持つことができます..

あなたの問題に関しては、この種の仕事のために定義されている2つの重要なインターフェースを見ることができます: - http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Comparator htmlおよびhttp://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Comparable.html ..

クラス インスタンスを比較する複数の方法が必要な場合は、Comparator を使用します。Comparator インターフェイスを実装するクラスを作成し、このクラスのインスタンスを Collections.sort() メソッドに渡して、この Comparator を並べ替えに使用できます。この場合、compare() メソッドを使用して比較を行います。

または、Comparable インターフェイスを実装するクラスを作成することにより、クラス インスタンスを比較する 1 つの方法のみを関連付けることができます。この場合、compareTo() メソッドをオーバーライドする必要があります。

Comparator を使用したサンプル コードを次に示します。

public class MyComparator implements Comparator<Box> {
    @Override
    public int compare(Box box0, Box box1) {
        int w0 = box0.getWeight();
        int w1 = box1.getWeight();

        return (w0 > w1? -1 : (w0 == w1) ? 0 : 1);
    }
}

public class Box {
    private int weight;

    public Box() {      
    }

    public Box(int weight) {
            this.weight = weight;
    }

    public int getWeight() {
        return weight;
    }

    public void setWeight(int weight) {
        this.weight = weight;
    }
}

そしてあなたのメイン

public class Main {

    public static void main(String args[]) {
        List<Box> boxList = new ArrayList<Box>();
        Collections.sort(boxList, new MyComparator());
    }
}

それが役に立てば幸い..

于 2012-09-18T12:35:11.727 に答える
0

独自のComparatorを定義し、Collections.sort()を使用して、その Comparator を渡すことができます。これにより、さまざまなフィールドを使用して検索するためのさまざまなコンパレータを定義できます。

Comparableまたは、構造体でインターフェイスを実装し、Collections.sort()これを使用して並べ替えることができます。これは、クラスに対して暗黙的であるため、自然な並べ替え順序を使用して呼び出されます。

並べ替えと並べ替えに関する Java チュートリアルは次のとおりです。

于 2012-09-18T09:30:40.353 に答える
0

インスタンスで使用java.util.Collections.sort()Comparatorます。JavaDoc を参照してください。

于 2012-09-18T09:34:03.063 に答える
0

最も簡単な解決策

次のように、クラスに java.lang.Comparable インターフェイスを実装するだけです。

class MyStruct implements Comparable<MyStruct>{

  public Boolean GUI;
  public float CallTime;
  public String ReqID;
  public String ReqGUID;
  public String Stereotype;
  public String StereotypeGUID;

  @Override
  public int compareTo(MyStruct other) {
    return ReqID.compareTo(other.ReqID); 
    /* also you can use ReqID.compareToIgnoreCase(other.ReqID); */
  }

  @Override
  public String toString() {
    return "(" + ReqID + ")";
  } 
}

印刷するためだけに toString() メソッドもオーバーライドします。

また、String の compareTo()メソッドは辞書順でソートされることに注意してください。数値 ID が必要な場合は、intまたはその他の数値型を使用することをお勧めします。以下は、Arrays.sort() と Collections.sort() を使用してソートする完全なコードです - あなたに合ったものを選択してください:)

public class MyStructSort {

  private final static String[] STRUCT_IDS = {"C", "D", "A", "Aa", "B", "Z", "Aaa" };

  private static List<MyStruct> createList() {

    List<MyStruct> structList  = new ArrayList<MyStruct>();
    for (String id: STRUCT_IDS) {
      MyStruct struct = new MyStruct();
      struct.ReqID = id;
      structList.add(struct);
    }
    return structList;
  }

  public static void main(String[] args) {

    List<MyStruct> dataList = createList();

    /* Sort using Lists (Collections) */
    Collections.sort(dataList);
    System.out.println("List sort:\t" + dataList);

    /* Sort using arrays */
    MyStruct[] dataArray = dataList.toArray(new MyStruct[dataList.size()]); 
    Arrays.sort(dataArray);
    // print sorted array
    System.out.print("Array sort:\t");
    for (MyStruct struct: dataArray) {
      System.out.print(struct+" ");                        
    }
  }
}

これは単なるデモンストレーション コードであるため、完璧にするには、いくつかの null チェックと getter および setter が必要になります。

于 2012-09-18T10:45:25.243 に答える
0

使用するArrays.sort(T[] a, Comparator<? super T> c)

またCollections.sort(List a, Comparator c)

于 2012-09-18T09:34:47.383 に答える