Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从包含相同类型的所有字符的arraylist中删除元素_Java_Arraylist - Fatal编程技术网

Java 从包含相同类型的所有字符的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.如果是,请注意当前元素的

从包含相同类型的所有字符的arraylist中删除任何项的最佳方法是什么

请参考下面的示例字符串数组列表数据:
要素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个或多个相同的
换言之,如果字符串仅由一个字符后跟其自身n次组成,请将其删除

如果要测试特定的重复字符,例如
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);
    }
}