Java 从包含相同类型的所有字符的arraylist中删除元素
从包含相同类型的所有字符的arraylist中删除任何项的最佳方法是什么 请参考下面的示例字符串数组列表数据:Java 从包含相同类型的所有字符的arraylist中删除元素,java,arraylist,Java,Arraylist,从包含相同类型的所有字符的arraylist中删除任何项的最佳方法是什么 请参考下面的示例字符串数组列表数据: 要素1:FFFFFFFF 要素2:123 要素3:ABCD1234 元素4:FFFFFFFFFFFFFFFFF 要素5:ABCDEF 从上面的数据中,我想删除第1条和第4条记录,因为它们包含所有字符“F” 到目前为止,我所尝试的是下面的伪代码: 1.在循环中迭代列表直到结束 2.获取当前元素的数据 3.检查元素字符串是否包含所有“F”字符而不包含其他字符。 4.如果是,请注意当前元素的
要素1:FFFFFFFF
要素2:123
要素3:ABCD1234
元素4:FFFFFFFFFFFFFFFFF
要素5:ABCDEF
从上面的数据中,我想删除第1条和第4条记录,因为它们包含所有字符“F” 到目前为止,我所尝试的是下面的伪代码:
1.在循环中迭代列表直到结束
2.获取当前元素的数据
3.检查元素字符串是否包含所有“F”字符而不包含其他字符。
4.如果是,请注意当前元素的索引位置,否则请移动到下一个元素
5.使用第二个循环从存储的索引位置删除元素
6.在这里,我陷入了困境,因为从arraylist中删除一个元素会更改其大小和剩余元素的索引位置 注意#如果该方法是动态的,可以提供任何字符(如元素包含所有“A”)。
String s=//在此处填充String的数据
int=1;
对于(int j=0;j
您可以使用正则表达式调用以测试重复字符:
listOfData.removeIf(s -> s.matches("(.)\\1*"));
要分解正则表达式,请执行以下操作:
匹配任何字符
捕获第一个字符()
捕获\1
查找0个或多个相同的*
c
,则更容易:
listOfData.removeIf(s -> s.matches(c + "+"));
这意味着“匹配
c
的一个或多个实例”。请注意,这不会处理像'('
这样的特殊字符。如果您使用的是Java 8,您可以按照@shmosel的建议使用List.removeIf()
。但是如果您想在较旧的Java版本下编译代码,请尝试以下方法
public static void removeCharacterSetElementFromList(char character, ArrayList<String> list){
ArrayList<String> listCopy = (ArrayList<String>)list.clone();
for (String listItem : listCopy){
boolean removable = listItem.length()>0 && character==listItem.charAt(0);
for (int i = 0; i < listItem.length(); i++){
char current = listItem.charAt(i);
if (character!=current) {
removable=false;
break;
}
}
if(removable) list.remove(listItem);
}
}
public静态void removeCharacterSetElementFromList(字符,数组列表){
ArrayList listCopy=(ArrayList)list.clone();
用于(字符串listItem:listCopy){
boolean removable=listItem.length()>0&&character==listItem.charAt(0);
对于(int i=0;i
然后您只需调用
removeCharacterSetElementFromList('F',listOfData)
删除重编码。毫无疑问,在这里发布之前,您已经尝试了许多可能的解决方案。请将这些添加到您的问题中,并澄清什么不起作用。所有相同类型的字符,或一种特定类型的字符?请向我解释为什么有4个否决票。如果没有人费心解释否决票的原因,那么在否决票之前,我会不应该再这样使用了。@RobbyCornelissen谢谢你这么好的文章。我理解的是我问错了问题。我应该提供我迄今为止所做工作的证据。因为这只是代码,如果我发布代码,可能会使读者的思维产生偏差。这是唯一的原因。这是我对未来的学习。F或者这个问题,我会相应地编辑它。再次感谢你的帮助。:-)你能告诉我这里的“s”是什么吗?我用了“(F)”来代替“()”。此外,我还了解到,我可以根据我在备注中提到的需要在此处放置任何字符。我想干什么就干什么。感谢您的时间和帮助。:-)正如我所说,您不需要第一个解决方案来匹配特定角色。只要做“F+”
.s.matches(“(F)\\1*”),这个序列就可以根据我的需要工作。我知道,但这是一种做一些非常简单的事情的反向方法。
public static void removeCharacterSetElementFromList(char character, ArrayList<String> list){
ArrayList<String> listCopy = (ArrayList<String>)list.clone();
for (String listItem : listCopy){
boolean removable = listItem.length()>0 && character==listItem.charAt(0);
for (int i = 0; i < listItem.length(); i++){
char current = listItem.charAt(i);
if (character!=current) {
removable=false;
break;
}
}
if(removable) list.remove(listItem);
}
}