3 回答

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超4個(gè)贊
首先,main在您的方法程序中和在接口中List(而不是ArrayList具體類(lèi)型)。此外,您還可以使用它Arrays.asList來(lái)創(chuàng)建您的初始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)。并追加創(chuàng)建要追加的項(xiàng)目的臨時(shí)列表,然后在遍歷List. 并且不要害怕將其存儲(chǔ)value在臨時(shí)變量中(list.get(index)既乏味又難以推理)。最后,您還可以使用變量保存“包含 l”和“包含 r”測(cè)試的結(jié)果。就像是,
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;
}
哪個(gè)輸出
love
lyre
love

TA貢獻(xiàn)1810條經(jīng)驗(yàn) 獲得超4個(gè)贊
與其搞亂循環(huán)、迭代器和ConcurrentModificationExceptions,不如嘗試使用流一個(gè)一個(gè)地執(zhí)行這些步驟。
首先,刪除包含 r 但不包含 l 的字符串。一個(gè)簡(jiǎn)單的List#removeIf方法調(diào)用就足夠了。
//Remove strings that contain r but not l
list.removeIf(s -> s.contains("r") && !s.contains("l"));
現(xiàn)在讓我們“克隆”包含 l 但不包含 r 的字符串。為此,我們將過(guò)濾列表并將結(jié)果收集到一個(gè)新的字符串列表中。然后調(diào)用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貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超3個(gè)贊
迭代時(shí)不要修改(添加/刪除)列表。這也適用于其他集合類(lèi)型。
維護(hù)兩個(gè)單獨(dú)的列表 - 一個(gè)用于要添加的元素 ( addList),另一個(gè)用于要?jiǎng)h除的元素( removeList)。最后,從主列表中刪除必需的元素 ( removeList) 并添加其他必需的元素 ( addList)。我已經(jīng)如上所述稍微修改了您的代碼。
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
添加回答
舉報(bào)