2
if (!mainMethods.matrix.isEmpty()) {
    for (int i = 0; i < mainMethods.matrix.values().size(); i++) {
        if (mainMethods.matrix.containsValue(getArrayList()[i].getValue().toString().contains(textValue.getText()))) {
            String errorTitle = "Impossível completar a operação.";
            String errorMessage = "Não é possível adicionar um valor de chave repetido.";
            JOptionPane.showMessageDialog(getParent(), errorMessage, errorTitle, JOptionPane.ERROR_MESSAGE);            
        }
    }

「マトリックス」と呼ばれるこの HashMap があり、多くのキーがあります。すべてのキーの値は、独自の値を持つ ArrayList です。これを考慮すると、HashMap のメソッド「.containsValue()」に String 引数を渡すと、メソッドが ArrayList を見つけるため、ArrayList-Values 内に特定の値があるかどうかをテストする方法が見つかりません。オブジェクトとテストは false になります。したがって、例で行ったように、かなり狂ったことをしなければなりません。ご覧のとおり、「getArrayList()」や「getValue()」のようなものはありません。これは非常に複雑な状況であり、「疑似コード」を使用してポイントを説明しようとしました。

あなたはそれを解決する方法を知っていますか?

4

4 に答える 4

3

私があなたを正しく理解していれば、次のようなことがうまくいくはずです:

private <K, V> V getValueIfKeyContains(final Map<List<K>, V> map, final K desiredKey) {
    for (final Entry<List<K>, V> entry : map.entrySet()) {
        if (entry.getKey().contains(desiredKey)) {
            return entry.getValue();
        }
    }
    return null;
}

したがって、 をループして、Map各キーに が含まれているかどうかを確認しますdesiredKey

次の 2 点を強くお勧めします。

  1. 可変値を a のキーとして使用しないでくださいMap。に追加されたに変更される可能性があるため、これにより大きな問題が発生しMapます。
  2. List確認したい場合は使用しないでくださいcontains。これはO(n)操作です。つまり、 のサイズに比例して時間がかかりますListList正しい要素が見つかるまで、すべての要素をループする必要があります。a を使用するSetと、操作はO(1)、つまり一定時間になります。
于 2013-06-01T20:06:18.933 に答える
1

イテレータを使用して、各配列リストを個別にチェックできます。

Iterator it = mainMethod.matrix.entrySet().iterator();
while (it.hasNext()) {
    Map.Entry pairs = (Map.Entry)it.next();
    If(pairs.getValue().contains(your value)
    {
        // do stuff
    }
}
于 2013-06-01T20:05:52.047 に答える
1

1 つのことを行います。データ構造を次のように変更します...

古いものは次のとおりです。

HashMap <Key, ArrayList>

への変更

HashMap<Key, HashMap<Value in ArrayList at index[i], Value in ArrayList at index[i]>>.

これは、arrayList 内に不変オブジェクトがあることを前提としています。したがって、キーを使用してオブジェクトを取得したら。そのキーを使用して、内部マップを再度検索できます。

于 2013-06-01T19:59:13.617 に答える