java 中的迭代器 - 删除范围内的数字
Iterators in java - remove numbers in a range
我正在尝试使用迭代器从 LinkedList 中删除数字。
我不能让它只从变量之间删除数字。
我的列表包含这些值:1、1、2、0、4、5、6、8、8、3、11、9、12、0、14、0、16]
方法的调用
removeEvenInRange(list,5,13)
应该删除索引 5 和 13 之间的偶数,最后得到一个包含的列表
[1,1,2,0,4,5,3,11,9,0,14,0,16
我不知道如何"tell"它只在索引 5 - 13 之间迭代。任何关于如何解决这个问题的帮助将不胜感激。
这是我目前拥有的:
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.LinkedList;
import java.util.ListIterator;
public class Ex11_3_RemoveEvenInRange {
public static void main(String[] args) {
List<Integer> list = new LinkedList<>();
list.addAll(Arrays.asList(1,1,2,0,4,5,6,8,8,3,11,9,12,0,14,0,16));
removeEvenInRange(list, 5, 13);
}
private static void removeEvenInRange(List<Integer> list, int i, int j) {
Iterator<Integer> itr = list.iterator();
for (int k = i; k < j; k++) {
int element = itr.next();
if (element % 2 == 0) {
itr.remove();
}
}
System.out.println(list);
}
}
你不能,除非你在 运行 你的代码之前调用 next()
n(在本例中为 5)次 - 这太疯狂了。
您最好的选择可能是将您的列表分成三个 sublists,遍历中间一个,然后在完成后合并列表。
另一种方法是直接在列表中使用 get(index)
和 remove(index)
,这样可以省去 split/merge 步骤,但是您必须确保为每个调整索引去掉。 split/merge 方法不太容易出错。
编辑:@Masud 的回答有这方面的示例代码,尽管它缺少合并步骤。
您当前的实施是从列表中删除索引 0
到索引 j - i - 1
的所有偶数,而不是从 i
到 j - 1
。范围发生偏移,因为直到 k
在范围内才进行迭代。
在索引 0
处开始您的 for
循环,因此您的索引与迭代器的索引一致。然后添加一个 if
语句来确定你的索引 k
是否在 i
和 j
之间的适当范围内。
for (int k = 0; k < j; k++) {
int element = itr.next();
if (k >= i && k < j)
{
if (element % 2 == 0) {
itr.remove();
}
}
}
您可以在两个索引之间subList
。试试,
static void removeEvenInRange(List<Integer> list, int i, int j){
List<Integer> subList= list.subList(i, j);
Iterator<Integer> itr = subList.iterator();
while (itr.hasNext()){
int element = itr.next();
if (element % 2 == 0) {
itr.remove();
}
}
System.out.println(list);
}
如果你想使用迭代器,你可以这样写:
for (int k = 0; k < j; k++) {
int element = itr.next();
if (k>=i) {
if (element % 2 == 0) {
itr.remove();
}
}
}
但如果使用 get(int index)
效率会更高
您将需要计数 并推进迭代器直到到达起始索引。然后继续并行计数,通过迭代器迭代和删除要删除的元素,直到 count 到达结束索引。
如果你坚持使用 LinkedList
,上述过程将比通过 List#remove(index)
方法删除更有效(如某些评论中所建议的),因为每次删除调用都会通过列表来查找索引。
我正在尝试使用迭代器从 LinkedList 中删除数字。 我不能让它只从变量之间删除数字。
我的列表包含这些值:1、1、2、0、4、5、6、8、8、3、11、9、12、0、14、0、16]
方法的调用
removeEvenInRange(list,5,13)
应该删除索引 5 和 13 之间的偶数,最后得到一个包含的列表
[1,1,2,0,4,5,3,11,9,0,14,0,16
我不知道如何"tell"它只在索引 5 - 13 之间迭代。任何关于如何解决这个问题的帮助将不胜感激。
这是我目前拥有的:
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.LinkedList;
import java.util.ListIterator;
public class Ex11_3_RemoveEvenInRange {
public static void main(String[] args) {
List<Integer> list = new LinkedList<>();
list.addAll(Arrays.asList(1,1,2,0,4,5,6,8,8,3,11,9,12,0,14,0,16));
removeEvenInRange(list, 5, 13);
}
private static void removeEvenInRange(List<Integer> list, int i, int j) {
Iterator<Integer> itr = list.iterator();
for (int k = i; k < j; k++) {
int element = itr.next();
if (element % 2 == 0) {
itr.remove();
}
}
System.out.println(list);
}
}
你不能,除非你在 运行 你的代码之前调用 next()
n(在本例中为 5)次 - 这太疯狂了。
您最好的选择可能是将您的列表分成三个 sublists,遍历中间一个,然后在完成后合并列表。
另一种方法是直接在列表中使用 get(index)
和 remove(index)
,这样可以省去 split/merge 步骤,但是您必须确保为每个调整索引去掉。 split/merge 方法不太容易出错。
编辑:@Masud 的回答有这方面的示例代码,尽管它缺少合并步骤。
您当前的实施是从列表中删除索引 0
到索引 j - i - 1
的所有偶数,而不是从 i
到 j - 1
。范围发生偏移,因为直到 k
在范围内才进行迭代。
在索引 0
处开始您的 for
循环,因此您的索引与迭代器的索引一致。然后添加一个 if
语句来确定你的索引 k
是否在 i
和 j
之间的适当范围内。
for (int k = 0; k < j; k++) {
int element = itr.next();
if (k >= i && k < j)
{
if (element % 2 == 0) {
itr.remove();
}
}
}
您可以在两个索引之间subList
。试试,
static void removeEvenInRange(List<Integer> list, int i, int j){
List<Integer> subList= list.subList(i, j);
Iterator<Integer> itr = subList.iterator();
while (itr.hasNext()){
int element = itr.next();
if (element % 2 == 0) {
itr.remove();
}
}
System.out.println(list);
}
如果你想使用迭代器,你可以这样写:
for (int k = 0; k < j; k++) {
int element = itr.next();
if (k>=i) {
if (element % 2 == 0) {
itr.remove();
}
}
}
但如果使用 get(int index)
效率会更高您将需要计数 并推进迭代器直到到达起始索引。然后继续并行计数,通过迭代器迭代和删除要删除的元素,直到 count 到达结束索引。
如果你坚持使用 LinkedList
,上述过程将比通过 List#remove(index)
方法删除更有效(如某些评论中所建议的),因为每次删除调用都会通过列表来查找索引。