0

私は今、ハッシュマップをいじっています。各ハッシュマップの値がchar配列の場合、2つのハッシュマップの値を比較する方法を見つけようとしています。私は周りを見回して、うまくいくかもしれないいくつかの方法を見つけました - 適切に実装する方法がわかりません。基本的に、キーは異なるが値が同じである 2 つのマップがあります。マップの 1 つを繰り返し処理し、同じ値の場合に true を返すブール値を作成したいと考えています。誰かがこれを理解するのを手伝ってくれたら、それは素晴らしいことです. 私のコードは、これまでに試したことを以下に示しています。

publipublic class MapExample {

public static void main(String[] args) {

    Map<String, char[]> map1 = new HashMap<String, char[]>();
    Map<String, char[]> map2 = new HashMap<String, char[]>();

    char[] letters1 = new char[3];
    letters1[0] = 'a';
    letters1[1] = 'b';
    letters1[2] = 'c';

    char[] letters2 = new char[3];
    letters2[0] = 'x';
    letters2[1] = 'y';
    letters2[2] = 'z';

    map1.put("1", letters1);
    map1.put("2", letters2);
    map1.put("3", letters1);

    map2.put("4", letters1);

    Set s = map1.entrySet();
    Iterator it = s.iterator();

    boolean containsValue;

    //I've tried this but it produces false (and infinite loop) when maps have the same value
    while (it.hasNext()) {

        containsValue = map1.equals(map2.values());
        System.out.println(containsValue);
    }

    //I've tried this too, but can't seem to adjust the lists to accept char[]
    /*
    List<String> values1 = new ArrayList<String>(map1.values());
    List<String> values2 = new ArrayList<String>(map2.values());
    Collections.sort(values1);
    Collections.sort(values2);
    boolean mapsHaveEqualValues = values1.equals(values2);*/

}
 }
4

3 に答える 3

1

無限ループ

it.next()を進めるにはを使用する必要がありますIteratorhasNext()次の要素に転送せずにイテレータを呼び出し続けます。

hasNext() :

反復にさらに要素がある場合は true を返します。(つまり、 next() が例外をスローするのではなく要素を返す場合は true を返します。)

次() :

繰り返しの次の要素を返します。

while (it.hasNext()) { 
    // need to use it.next() somewhere, but you don't really need loop here
    containsValue = map1.equals(map2.values());
    System.out.println(containsValue);
}

map1.equals(map2.values());

あなたがやりたかったことはmap1.values().equals(map2.values());

List<String> values1 = new ArrayList<String>(map1.values());

Character[]の代わりにa を定義し、それをおよび リストchar[]に追加しますMap<String, Character[]> map1List<Character[]> values1 = new ArrayList<Character[]>(map1.values());

于 2013-06-19T16:04:16.607 に答える
0

間違っていることすべてをどこから始めればよいか。

Object.equalsa の呼び出しは、内容に関係なく、それらがまったく同じオブジェクトである場合にchar[]のみ返されます。trueあなたはそれに依存していないことに注意してください。

イテレータを使用していますが、決して呼び出していませんnext。高級な for ループを使用するのが最善です。

Mapaと a Collection( Mapis not (通常) a )を比較しているCollectionため、うまくいきません。

CollectionからのMap.valuesは袋です、唯一の保証はありませんjava.util.Bag。したがって、たまたま default を使用し、Object.equals別のコレクションから返された同じ要素を持つコレクションと等しいと比較することさえありませMap.valuesん (まったく同じインスタンスでない限り)。

values2 つのコレクションを比較しようとすると、問題が発生します。HashSet1 つのコレクションを にコピーしてから を呼び出すと、共通の要素を簡単に確認できますretainAll。バッグの比較を行うには、簡単にサードパーティのライブラリ (Guava はおそらく自分で使用していない) を使用するか、自分でアルゴリズムを実装する必要があります。たとえば、 にコピーしLists、並べ替えて、2 つのイテレータを使用して両方を一度に反復処理します。

于 2013-06-19T16:13:40.843 に答える