List<Integer> listArr = new ArrayList<>();
listArr.add(5);
listArr.add(7);
listArr.add(90);
listArr.add(11);
listArr.add(55);
listArr.add(60);
for(int i = 0; i < listArr.size(); i ) {
if (listArr.get(i) % 2 != 0) {
listArr.remove(i);
}
}
我試圖從 ArrayList 中洗掉所有奇數,它必須是for或foreEach回圈。對于回圈完成后 ArrayList 中剩余的數字,結果將是 7、90、55、60。當我設定條件時:
if(listArr.get(i) % 2 == 0)
一切正常。所有偶數都被洗掉,但在第一個示例中,奇數不是這種情況。為什么會這樣?
uj5u.com熱心網友回復:
您不應該使用 for 回圈(添加和洗掉)編輯串列,而不要使用迭代器,例如:
List<Integer> listArr = new ArrayList<>();
listArr.add(5);
listArr.add(7);
listArr.add(90);
listArr.add(11);
listArr.add(55);
listArr.add(60);
var it = listArr.iterator();
while (it.hasNext()) {
var n = it.next();
if (n % 2 == 0) {
it.remove();
}
}
uj5u.com熱心網友回復:
因為當您洗掉 arraylist 中的專案時,您已經更改了串列,請嘗試以反向模式對其進行迭代。分解:
- 當 i = 0 時,您的代碼將其從串列中洗掉,然后串列中的索引 0 為 7
- 當 i = 1 時,1 上的索引為 90,因此您的代碼不會將其洗掉。
- 當 i = 2 時,2 上的索引為 11,因此您的代碼將其洗掉,然后串列中 2 上的索引為 55,
- 當 i = 3 時,索引在 3 i 60 上,所以它會被保留。
回圈結束,這就是為什么你的代碼輸出你看到的,這就是為什么你應該以反向模式運行它
uj5u.com熱心網友回復:
答案只是簡單的一行,實際上您可以使用流 api 使用多種方法來實作它,這里我們使用 Collector 介面。
public class Main {
public static void main(String[] args) {
//question values
List<Integer> list = new ArrayList<>();
list.add(5);
list.add(7);
list.add(90);
list.add(11);
list.add(55);
list.add(60);
//answer
List<Integer> result = list.stream().collect(ArrayList::new, (u, v) -> {if(v % 2 == 0) u.add(v);}, List::addAll);
//validating result
result.forEach(System.out::println);
}
}
更重要的是,您可以通過創建如下的自定義收集器來獲得相同的結果
public class OddNumbersCollector implements Collector<Integer, List<Integer>, List<Integer>> {
@Override
public Supplier<List<Integer>> supplier() {
return ArrayList::new;
}
@Override
public BiConsumer<List<Integer>, Integer> accumulator() {
return (u, v) -> {
if(v % 2 == 0)
u.add(v);
};
}
@Override
public BinaryOperator<List<Integer>> combiner() {
return (u, v) -> {
u.addAll(v);
return u;
};
}
@Override
public Function<List<Integer>, List<Integer>> finisher() {
return Function.identity();
}
@Override
public Set<Characteristics> characteristics() {
return Collections.unmodifiableSet(EnumSet.of(Characteristics.IDENTITY_FINISH, Characteristics.CONCURRENT));
}
}
并在這種情況下回答成為
List<Integer> result = list.stream().collect(new OddNumbersCollector());
就是這樣,不需要額外的努力。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/394437.html
標籤:爪哇
