1
Class Order
{
  String  name;
  Order(String n)
   { name = n; }

 //setter and getters of name
}

Order a = new Order("same");
Order b = new Order("same");
Order c = new Order("diff");

List<Order> nameList// a,b,c

したい

seperate list of Orders 
     List<Order> dupList// a,b
     List<Order> nondupList// c

ここで、「nameList」の複数の順序で同じ名前が使用可能かどうかを確認したいと思います。

リストのインデックスを使用して、そのインデックス以外のリストの順序と比較することを達成しました。

しかし、これを達成するための他のより良い方法はありますか?

4

3 に答える 3

1

おそらくもう1つの方法は、hashCodeメソッドとequalsメソッドをオーバーライドすることです。文字列名の計算時にhasCodeを生成します。

public class Order {
    String name;

    public Order(String n) {
        name = n;
    }

    // setter and getters of name
    @Override
    public int hashCode() {
        int h = 0;
        int len = name.length();
        for (int i = 0; i < len; i++)
            h = 31 * h + name.charAt(i);
        return h;
    }
    @Override
    public boolean equals(Object obj) {
        if(obj == null)
            return false;
        else if(this.hashCode() == obj.hashCode())
            return true;
        return false;
    }
}

..。

List<Order> nameList = ...;// a,b,c
Set<Order> nonDuplicate= new HashSet<Order>(nameList);
于 2013-02-08T08:02:05.353 に答える
1

純粋なJavaを使用する場合は、要素をリストに追加sortし、適切なコンパレータを使用します。次に、リストを繰り返し、前の要素を追跡し、コントロールブレークを実行します。つまり、要素が前のものと同じである場合、両方が重複しています。そうでない場合(または最初の場合)は候補であり、次のチェックで重複が見つかるまで待つ必要があります。

並べ替えたくない場合は、表示されたとおりに要素をセットに追加できます。要素を追加する前に、その要素がすでにセットに含まれている場合は、それを複製セットに追加できます。両方のセットをチェックしながら削除するか、完全なセットから最後に重複を削除することができます。任意のコレクションを使用できますが、Setには高速のcontainsメソッドがあるため、Setの方が効率的です。

ライブラリを使用できる場合は、Guavaを使用して、すべてをマルチセットに追加できます(http://google-collections.googlecode.com/svn/trunk/javadoc/com/google/common/collect/Multiset.html)次に、繰り返します。マルチセットを超えて、要素ごとのカウントがあります。

于 2013-02-08T08:03:14.530 に答える
0

Map>を使用して、指定された名前のリストを取得します。nullの場合は、それを作成して配置し、そのリストに現在の順序を追加します。

于 2013-02-08T08:16:40.707 に答える