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