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,它有自己的值。考虑到这一点,我无法找到一种方法来测试 ArrayList-Values 中是否存在特定值,因为如果我将 String 参数传递给 HashMap 的方法“.containsValue()”,该方法将找到一个 ArrayList对象和测试将是错误的。因此,我必须做一些相当疯狂的事情,就像我在示例中所做的那样。如您所见,没有“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.

强烈推荐两件事:

  1. 不要使用可变值作为Map. 这会导致大量问题,因为它们添加到Map.
  2. List如果要检查,请勿使用contains。这是一个O(n)操作,即它所花费的时间与List. 它必须遍历 中的每个元素,List直到找到正确的元素。使用 a Set,运算变为O(1),即常数时间。
于 2013-06-01T20:06:18.933 回答
1

做一件事。将数据结构更改为...

旧的是:

HashMap <Key, ArrayList>

改成

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

这是假设您在 arrayList 中有不可变对象。所以现在一旦你使用 key 得到一个对象。您可以再次使用其键在内部地图中搜索。

于 2013-06-01T19:59:13.617 回答
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 回答
0

使用for-each循环遍历您ArrayList的 s (我假设它们持有Strings)并使用他们的contains()方法来测试值是否存在于其中。

if (!mainMethods.matrix.isEmpty()) {
  for (List<String> list : mainMethods.matrix.values()) {
    if (list.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);
    }
  }
}

如果可能,切换到使用 aSet而不是 aList因为搜索集合要快很多倍。但是集合不允许你有重复。因此,请选择更适合您要求的产品。

于 2013-06-01T21:29:38.700 回答