3

さて、次のようなオブジェクトの配列があるとします。obj(from、to)fromとtoを比較して、その配列を並べ替えたいと思います。私がやりたいことの例:これらのパラメーターを持つオブジェクトがあるとします(0,2)(2,4)(0,3)(4,5)(2,3)
オブジェクトをこの順序でソートしたい:(0,2)(0,3)(2,3)(2,4)(4,5)

最初の2つの「from」変数を比較し、下の変数を前に配置します。それらが等しい場合は、2番目の数のペアを比較します。これを行うために、比較メソッドを作成しました

public int compare (EdgeI e1, EdgeI e2) {
  if(e1.from < e2.from) { return -1; }
  else if(e1.from == e2.from) {
    if(e1.to < e2.to) { return -1; }
    else if(e1.to == e2.to) { return 0; }
    else if(e1.to > e2.to) { return 1; }
  }
  return 1;
}

これは機能しますか?もしそうなら、どのように配列を介してこのソートを実行しますか?助けてくれてありがとう。

編集

    public class mySorter implements Comparator <EdgeI> {

  public int compare(EdgeI e1, EdgeI e2) {
    if(e1.from < e2.from) { return -1; }
    else if(e1.from == e2.from) {
      if(e1.to < e2.to) { return -1; }
      else if(e1.to == e2.to) { return 0; }
      else if(e1.to > e2.to) { return 1; }
    }
    return 1;
  }

  public void sorterM () {
    Collections.sort(tet2, new mySorter());
  }

}

「コレクションを解決できません」というエラーが表示され、tet2を解決できません。Tet2は、別のクラスで公開されているリストです。

4

3 に答える 3

2

できることは、を実装するクラスを作成することですComparator<Edge>。次に、compareメソッドを使用して、インターフェースからメソッドを実装できます。

これを行った後、コンパレータを使用して、を使用してEdgeオブジェクトのリストを並べ替えることができますCollections.sort()

これは次のようになります。

import java.util.Collections;
import java.util.List;
import java.util.Comparator;

public class EdgeComparator implements Comparator<Edge> {
    public int compare(Edge l, Edge r) { ... }
}

void yourCode() {
    List<Edge> edges = ...;
    Collections.sort(edges, new EdgeComparator());
    //edges now contains the sorted edges
}

これがComparatorCollections.sortのjavadocです。

リストの代わりに配列がある場合は、代わりに。と同じ方法でArray.sortCollections.sortを使用できます。

于 2012-10-12T00:37:20.547 に答える
1

EdgeIオブジェクトを比較可能にするか、EdgeIオブジェクトの比較を処理するための個別のコンパレータを作成することができます。この状況では(EdgeIクラスを作成したと仮定して)、よりオブジェクト指向のアプローチはComparableを実装することです。

public class EdgeI implements Comparable<EdgeI> {
    ...
    public int compareTo(EdgeI other) {
        // implement your compare method to use this and other instead of e1 and e2
    }
    ...
}

次に、plainを使用できます。メソッドは、継承されたメソッドによって指定された自然な順序Arrays.sortに基づいてエッジを並べ替えます。compareTo

EdgeI[] edges = ...;
Arrays.sort(edges);

または、Comparatorを実装し、それをターゲット配列とともにsortメソッドに渡して並べ替えることもできます。

public class EdgeComparator implements Comparator<EdgeI> {

    public int compare(EdgeI e1, EdgeI e2) {
        // your method in its exact format
    }
}

そしてそれをソートするには:

EdgeI[] edges = ...;
Arrays.sort(edges, new EdgeComparator());
于 2012-10-12T00:37:50.003 に答える
0

パーティーに遅れましたが、ここに1つの可能な実装があります。メソッド内でCollections.sortを呼び出すことで、Comparatorsを静的にすることを回避できます。これは、現実的には実行することです。2つのコンパレータがあることに注意してください。並べ替える方法が複数ある場合は、好きなだけ自由に作成できます。つまり、この場合は昇順と降順です。Collections.sort(edges, ORIGINAL);またはを呼び出すだけの問題ですCollections.sort(edges, REVERSE);

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

public class EdgeI{

    private int from;
    private int to;

    public EdgeI(int f, int t)
    {
        from = f;
        to = t;
    }

    public void setFromTo(int f, int t)
    {
        from = f;
        to = t;
    }

    public int getFrom()
    {
        return from;
    }

    public int getTo()
    {
        return to;
    }

    public final static Comparator<EdgeI> REVERSE = new Comparator<EdgeI>()
    {
    @Override
    public int compare(EdgeI e1, EdgeI e2)
    {
        if(e1.from < e2.from)
            return 1;
        if(e1.from > e2.from)
            return -1;
        //else they are equal
        if(e1.to < e2.to)
            return 1;
        if(e1.to > e2.to)
            return -1;
        //else both edges are equal
        return 0;
    }
    };

    public final static Comparator<EdgeI> ORIGINAL = new Comparator<EdgeI>()
    {
    @Override
    public int compare(EdgeI e1, EdgeI e2)
    {
          if(e1.from < e2.from) { return -1; } 
          else if(e1.from == e2.from)
          { 
            if(e1.to < e2.to) { return -1; } 
            else if(e1.to == e2.to) { return 0; } 
            else if(e1.to > e2.to) { return 1; } 
          } 
          return 1; 
    } 
    };

    public static void main(String[] args) {
        ArrayList<EdgeI>edges = new ArrayList<EdgeI>(5);
        edges.add(new EdgeI(0, 2));
        edges.add(new EdgeI(2, 4));
        edges.add(new EdgeI(0, 3));
        edges.add(new EdgeI(4, 5));
        edges.add(new EdgeI(2, 3));

        System.out.println("\nBefore sorting:");
        for(EdgeI i : edges)
            System.out.println("("+i.getFrom()+", "+i.getTo()+")");

        Collections.sort(edges, ORIGINAL);

        System.out.println("\nAfter sorting:");
        for(EdgeI i : edges)
            System.out.println("("+i.getFrom()+", "+i.getTo()+")");

    }
}
/*
Output on the console:

Before sorting:
(0, 2)
(2, 4)
(0, 3)
(4, 5)
(2, 3)

ORIGINAL:
After sorting:
(0, 2)
(0, 3)
(2, 3)
(2, 4)
(4, 5)

REVERSE:
After sorting:
(4, 5)
(2, 4)
(2, 3)
(0, 3)
(0, 2)
*/
于 2012-10-12T01:24:54.570 に答える