Java-如何检查ArrayList中是否有一个值是HashMap中键的值? if(!mainMethods.matrix.isEmpty()){ 对于(int i=0;i

Java-如何检查ArrayList中是否有一个值是HashMap中键的值? if(!mainMethods.matrix.isEmpty()){ 对于(int i=0;i,java,arraylist,hashmap,Java,Arraylist,Hashmap,有一个名为“矩阵”的HashMap,它有很多键。每个键的值都是一个有自己值的ArrayList。考虑到这一点,我找不到一种方法来测试ArrayList值中是否有特定值,因为如果我将字符串参数传递给方法“.containsValue()”对于HashMap,该方法将找到ArrayList对象,测试将为false。因此,我必须做一些相当疯狂的事情,就像我在示例中所做的那样。正如您所看到的,没有“getArrayList()”或“getValue()”这样的事情。这是一个非常复杂的情况,我试图用“伪代

有一个名为“矩阵”的HashMap,它有很多键。每个键的值都是一个有自己值的ArrayList。考虑到这一点,我找不到一种方法来测试ArrayList值中是否有特定值,因为如果我将字符串参数传递给方法“.containsValue()”对于HashMap,该方法将找到ArrayList对象,测试将为false。因此,我必须做一些相当疯狂的事情,就像我在示例中所做的那样。正如您所看到的,没有“getArrayList()”或“getValue()”这样的事情。这是一个非常复杂的情况,我试图用“伪代码”来解释我的观点


您知道如何解决它吗?

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

旧的是:

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
改为

HashMap


这是假设在arrayList中有不可变的对象。因此,现在,一旦使用key获得对象,就可以再次使用其键在内部映射中搜索。

您可以使用迭代器分别检查每个arrayList:

HashMap <Key, 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
    }
}
private V getValueIfKeyContains(最终映射映射,最终K desiredKey){
for(最终条目:map.entrySet()){
if(entry.getKey()包含(desiredKey)){
返回条目.getValue();
}
}
返回null;
}
因此,在
映射上循环
,并检查每个键是否包含
desiredKey

我强烈推荐两件事:

  • 不要将可变值用作
    映射
    中的键。这会导致大量问题,因为它们在添加到
    映射
    后可能会发生更改
  • 如果要检查
    包含
    ,请不要使用
    列表
    。这是一个
    O(n)
    操作,即它需要与
    列表
    的大小成比例的时间。它必须在
    列表
    中的每个元素上循环,直到找到正确的元素。使用
    设置
    ,操作变为
    O(1)
    ,即恒定时间

  • 对每个
    循环使用一个
    ,在
    数组列表
    s上迭代(我假设它们持有
    字符串
    s),并使用它们的
    contains()
    方法来测试其中是否存在值

    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;
    }
    
    if(!mainMethods.matrix.isEmpty()){
    对于(列表:mainMethods.matrix.values()){
    if(list.contains(textValue.getText())){
    String errorTitle=“Imposisível completar a operação.”;
    String errorMessage=“Nãoépossível adicionar um valor de chave repetido。”;
    JOptionPane.showMessageDialog(
    getParent()、errorMessage、errorTitle、JOptionPane.ERROR\u消息);
    }
    }
    }
    

    如果可能的话,切换到使用
    集合
    而不是
    列表
    ,因为搜索集合的速度要快很多倍。但是集合不允许有重复项。因此,选择更适合您的要求的集合。

    非常有趣!我会尝试这样做。我建议您尝试简化代码。我不认为您真的需要代码来做什么您已经编写了。请尝试将代码分解为较短的代码行,并查看它们在调试器中执行的操作。
    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);
        }
      }
    }