Java 检查ArrayList中的子字符串

Java 检查ArrayList中的子字符串,java,Java,我正在循环for循环以检查元素的子字符串: 示例:标题-->[经理、营销经理、销售、销售和营销经理] 预期结果:[销售和营销经理] 由于manager是Marketing manager的子字符串,因此我将删除元素manager,然后Sales是Sales and Marketing manager的子字符串,因此我将从数组中删除Sales元素,同时Marketing manager是Sales and Marketing manager的子字符串,因此将Marketing manager从列表

我正在循环for循环以检查元素的子字符串: 示例:标题-->[经理、营销经理、销售、销售和营销经理] 预期结果:[销售和营销经理] 由于manager是Marketing manager的子字符串,因此我将删除元素manager,然后Sales是Sales and Marketing manager的子字符串,因此我将从数组中删除Sales元素,同时Marketing manager是Sales and Marketing manager的子字符串,因此将Marketing manager从列表中删除,这样最终输出将是[销售和营销经理]

static String removeSecWords(List<String> titles) {


         for (int j = 0; j < titles.size(); j++) {
                for (int k = 0; k < titles.size(); k++) {
                    if (j == k)
                        continue;
                    if (titles.get(j).contains(titles.get(k))) {
                        titles.remove(k);

                    }
                }
            }
    return (titles.toString());
}
static String removeSecWords(列表标题){
对于(int j=0;j

我收到错误IndexOutOfBounds exception可以告诉我如何执行此操作。

您的代码不安全:您删除列表中的内容,同时使用size()。您必须将其分开

一个单独的解决方案集:

static String removeSecWords(List<String> titles) {

    // Keep all at begining
    Set<String> to_keep=new HashSet<String>();
    for (int j = 0; j < titles.size(); j++)
        to_keep.add(titles.get(j));

    for (int j = 0; j < titles.size(); j++) {
           for (int k = 0; k < titles.size(); k++) {
               if (j == k)
                   continue;

               if ((to_keep.contains(titles.get(j)) && (to_keep.contains(titles.get(k)))))
                   if (titles.get(j).contains(titles.get(k)))
                        {
                        to_keep.remove(titles.get(k)); 
                        }
           }
       }

    return (to_keep.toString());
static String removeSecWords(列表标题){
//从头开始
设置为_keep=new HashSet();
对于(int j=0;j

}

您的代码不安全:您删除列表中的内容,同时使用size()。您必须将其分开

一个单独的解决方案集:

static String removeSecWords(List<String> titles) {

    // Keep all at begining
    Set<String> to_keep=new HashSet<String>();
    for (int j = 0; j < titles.size(); j++)
        to_keep.add(titles.get(j));

    for (int j = 0; j < titles.size(); j++) {
           for (int k = 0; k < titles.size(); k++) {
               if (j == k)
                   continue;

               if ((to_keep.contains(titles.get(j)) && (to_keep.contains(titles.get(k)))))
                   if (titles.get(j).contains(titles.get(k)))
                        {
                        to_keep.remove(titles.get(k)); 
                        }
           }
       }

    return (to_keep.toString());
static String removeSecWords(列表标题){
//从头开始
设置为_keep=new HashSet();
对于(int j=0;j

}如果从
标题中删除
j
,则
j
可能等于
titles.size();
,因此下次尝试
titles.get(j)
时,会出现
索引自动边界异常
。要修复代码,您需要考虑如何处理
k
j

当您从
标题中删除
时,您不希望增加
k
,因为否则将跳过元素。我已经编写了
k--;
作为一个快速而懒惰的修复程序,但通常我不建议更改传统
for
循环中的索引

此外,如果
j
位于您移除的位置之后,您也需要更改
j
索引,因此它仍然引用相同的元素。请尝试此版本:

for (int j = 0; j < titles.size(); j++) {
    for (int k = 0; k < titles.size(); k++) {
        if (j != k && titles.get(j).contains(titles.get(k))) {
            titles.remove(k);
            if (j > k)
                j--;
            k--;
        }
    }
}
for(int j=0;jk)
j--;
k--;
}
}
}

如果从
标题中删除
标题,则
j
可能等于
titles.size();
,因此下次尝试
标题时,获取(j)
将获得
索引自动边界异常
。要修复代码,您需要考虑如何处理
k
j

当您从
标题中删除
时,您不希望增加
k
,因为否则将跳过元素。我已经编写了
k--;
作为一个快速而懒惰的修复程序,但通常我不建议更改传统
for
循环中的索引

此外,如果
j
位于您移除的位置之后,您也需要更改
j
索引,因此它仍然引用相同的元素。请尝试此版本:

for (int j = 0; j < titles.size(); j++) {
    for (int k = 0; k < titles.size(); k++) {
        if (j != k && titles.get(j).contains(titles.get(k))) {
            titles.remove(k);
            if (j > k)
                j--;
            k--;
        }
    }
}
for(int j=0;jk)
j--;
k--;
}
}
}

我认为问题的本质是,在使用索引对列表进行迭代时,会从列表中删除项目。删除项目后,列表会变短,但循环仍会尝试检查这些索引(不再存在,导致IndexOutOfBounds异常)。可能有更好的解决方案,但反向迭代列表可以避免这种情况。我认为问题的本质是,使用索引迭代列表时,会从列表中删除项。删除项后,列表会更短,但循环仍会尝试检查这些索引(不再存在,导致IndexOutOfBounds异常)。可能有更好的解决方案,但反向迭代列表可以避免这种情况。好的……我尝试过,但我得到了输出[销售、销售和营销经理]..当我们打破循环时,还有一个比较悬而未决。@Anji这很混乱,但我想我已经解决了。@Paul Boddington这很好。.我想我得到了预期的结果…我将测试更多的场景。。。Thanks@Anji我又改进了一次。如果您更改
j
索引,您将