3 回答
TA贡献1828条经验 获得超4个赞
首先,main在您的方法程序中和在接口中List(而不是ArrayList具体类型)。此外,您还可以使用它Arrays.asList来创建您的初始list. 喜欢,
public static void main(String[] args) throws Exception {
List<String> list = new ArrayList<>(Arrays.asList("rose", "love", "lyre"));
list = fix(list);
for (String s : list) {
System.out.println(s);
}
}
然后,为了避免ConcurrentModificationException您需要使用Iterator.remove()(如 Javadoc 所述The behavior of an iterator is unspecified if the behavior of an iterator is unspecified if the underlying collection is used modified while the iteration is progress while the iteration is progress with any way other through the calling this method)。并追加创建要追加的项目的临时列表,然后在遍历List. 并且不要害怕将其存储value在临时变量中(list.get(index)既乏味又难以推理)。最后,您还可以使用变量保存“包含 l”和“包含 r”测试的结果。就像是,
public static List<String> fix(List<String> list) {
Iterator<String> iter = list.iterator();
List<String> appendList = new ArrayList<>();
while (iter.hasNext()) {
String value = iter.next();
boolean containsR = value.contains("r"), containsL = value.contains("l");
if (containsR && containsL) {
continue;
} else if (containsR) {
iter.remove();
} else if (containsL) {
appendList.add(value);
}
}
list.addAll(appendList);
return list;
}
哪个输出
love
lyre
love
TA贡献1810条经验 获得超4个赞
与其搞乱循环、迭代器和ConcurrentModificationExceptions,不如尝试使用流一个一个地执行这些步骤。
首先,删除包含 r 但不包含 l 的字符串。一个简单的List#removeIf方法调用就足够了。
//Remove strings that contain r but not l
list.removeIf(s -> s.contains("r") && !s.contains("l"));
现在让我们“克隆”包含 l 但不包含 r 的字符串。为此,我们将过滤列表并将结果收集到一个新的字符串列表中。然后调用List#addAll以将它们添加到原始列表中。
//Find all strings that contain l but not r
List<String> stringsThatContainLButNotR = list.stream().filter(s -> s.contains("l") && !s.contains("r"))
.collect(Collectors.toList());
list.addAll(stringsThatContainLButNotR);
完整示例:
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("rose"); // 0
list.add("love"); // 1
list.add("lyre"); // 2
//Remove strings that contain r but not l
list.removeIf(s -> s.contains("r") && !s.contains("l"));
//Find all strings that contain l but not r
List<String> stringsThatContainsLButNotR = list.stream().filter(s -> s.contains("l") && !s.contains("r"))
.collect(Collectors.toList());
list.addAll(stringsThatContainsLButNotR);
list.forEach(System.out::println);//prints "love","lyre","love"
}
TA贡献1818条经验 获得超3个赞
迭代时不要修改(添加/删除)列表。这也适用于其他集合类型。
维护两个单独的列表 - 一个用于要添加的元素 ( addList),另一个用于要删除的元素( removeList)。最后,从主列表中删除必需的元素 ( removeList) 并添加其他必需的元素 ( addList)。我已经如上所述稍微修改了您的代码。
import java.util.ArrayList;
import java.util.List;
public class DuplicateItemInList {
public static void main(String[] args) throws Exception {
ArrayList<String> list = new ArrayList<>();
list.add("rose"); // 0
list.add("love"); // 1
list.add("lyre"); // 2
list = fix(list);
for (String s : list) {
System.out.println(s);
}
}
public static ArrayList<String> fix(ArrayList<String> list) {
List<String> addList = new ArrayList<>();
List<String> removeList = new ArrayList<>();
for (int i = 0; i < list.size(); i++)
{
if (list.get(i).contains("r") && list.get(i).contains("l"))
{
continue;
} else if (list.get(i).contains("r"))
{
removeList.add(list.get(i));
} else if (list.get(i).contains("l"))
{
addList.add(list.get(i));
}
}
list.removeAll(removeList);
list.addAll(addList);
return list;
}
}
输出:
love
lyre
love
添加回答
举报