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中是否存在specic值,因为如果我将String参数传递给HashMap的方法“.containsValue()”,该方法将找到一个ArrayList对象和测试将是错误的。因此,我必须做一些相当疯狂的事情,就像我在例子中所做的那样。正如您所看到的,没有像“getArrayList()”或“getValue()”这样的东西。这是一个非常复杂的情况,我试图用“伪代码”解释我的观点。
你知道怎么解决吗?
答案 0 :(得分: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
。
我会强烈推荐两件事:
Map
中的键。这会导致大量问题,因为他们可以在将添加到Map
后进行更改。List
,请不要使用contains
。这是O(n)
操作,即需要时间与List
的大小成比例。它必须遍历List
中的每个元素,直到找到正确的元素。使用Set
,操作变为O(1)
,即恒定时间。答案 1 :(得分:1)
做一件事。将您的数据结构更改为...
旧的是:
HashMap <Key, ArrayList>
更改为
HashMap<Key, HashMap<Value in ArrayList at index[i], Value in ArrayList at index[i]>>
。
这假设您在arrayList中有不可变对象。所以现在一旦你得到一个使用密钥的对象。您可以再次使用其键在内部地图中搜索。
答案 2 :(得分:1)
您可以使用迭代器并单独检查每个arraylist:
Iterator it = mainMethod.matrix.entrySet().iterator();
while (it.hasNext()) {
Map.Entry pairs = (Map.Entry)it.next();
If(pairs.getValue().contains(your value)
{
// do stuff
}
}
答案 3 :(得分:0)
使用for-each
循环迭代ArrayList
(我假设他们持有String
s)并使用他们的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);
}
}
}
如果可能,请切换为使用Set
代替List
,因为搜索设置的速度要快很多倍。但是套装不允许你有重复。因此,请选择更适合您需求的产品。