导航:首页 > 编程语言 > java遍历删除list

java遍历删除list

发布时间:2022-04-22 11:48:48

A. java哪个list可以遍历的时候删除元素

遍历的时候想要删除元素就使用queue或者stack,不要使用list。list作为列表的数据结构在遍历期间是不允许进行变动的。

B. java List 遍历和删除 急

List可以用序号来遍历,但通常推荐使用iterator来遍历
Iterator itr = list.iterator();
while (itr.hasNext()) {
Object nextObj = itr.next();
}

如果要全部删除,用clear()方法是最简单的。
另外,Iterator也带有remove()方法,可以在遍历的时候,根据一定条件来进行删除。

示例:

import java.util.*;

public class Test {
public static void print(List<Integer> list) {
Iterator<Integer> itr = list.iterator();
while (itr.hasNext()) {
System.out.print(itr.next());
System.out.print(", ");
}
System.out.println();
}

public static void main(String[] args) {
List<Integer> s = new ArrayList<Integer>();
for (Integer i = 0; i < 10; i++) {
s.add(i);
}
print(s);

Iterator<Integer> itr = s.iterator();
while (itr.hasNext()) {
Integer i = itr.next();
if (i % 3 == 0) {
itr.remove();
}
}
print(s);
}
}

C. java中list的遍历有几种方式

1.使用索引(index)来遍历List
2.使用Iterator来遍历List。(for-each其实也是利用Iterator)
注意:如果仅仅是遍历,那么可以可以使用索引或Iterator来遍历。但是,如果你在遍历的同时还要删除元素,则最好使用Iterator来遍历和删除元素,这样可以避免异常。

D. java 怎么删除List中的指定元素

主要有三种方法:

  1. 用一个List 记录要删除的数据,最后removeAll(List);

E. java中 foreach 和迭代器在遍历 List 集合 一些情况下为什么能使用集合自动的删除方法删除元素

你a<70的时候是倒数第二位,也就是66,没有抛出异常是因为之前list大小为5,你删除66后,list大小为4,你第一次遍历list大小为5的数组的时候,66的cursor在index = 4,当你删除后,遍历list大小为4的数组时, cursor = 4 = newlist.size()。

ArrayList里的这个方法就会判断list已经读取完毕了,所以不会抛出异常。

publicbooleanhasNext(){
returncursor!=size;
}

a < 90的时候在第二位就发生了变化,list的大小也发生了变化

看了下ArrayList的源码,每次循环的时候都会call这个方法检查list的大小是否发生了变化,但是这个方法是发生在hasNext方法之后的

(){
if(modCount!=expectedModCount)
();
}

F. Java中遍历ArrayList的过程中删除元素操作会发生并发修改异常

首先搞清楚不是x=n-1不报错。是因为他避开了错误,实际当你用倒数第2个来删除的时候,他就已经跳出循环,不会判断最后以为,这是为什么呢?

我们先看看加强for循环是怎么实现的。都知道是通过迭代实现,那么将for写成迭代器来看。

Iterator<Object>itr=al.iterator();
while(itr.hasNext()){
Objecto=itr.next();
System.out.println(itr.hasNext());
if("n".equals(o)){
al.remove(o);
}
}

以上就是加强for循环的真正样子。再来透析源代码。

al.iterator():返回一个迭代器没什么好说的;

itr.hasNext():通过判断cursor(游标) != size(长度)来决定是否结束循环,cursor(游标) 初始是0 每次经过itr.next() +1;当cursor==size时 会跳出循环,这也是为什么倒数第2个不会出错的主要原因;

itr.next(): 看源代码可以发现每次在next()调用后,都会先调用checkForComodification()这个方法;

checkForComodification(): 主要作用是判断itr迭代器数据是否和list一致,

有两个参数,

第一个modCount 集合结构变动次数,如:一开始你add调用了7次,那么这个数就是7,

第二个expectedModCount 在调用iterator()方法时,初始化值等于modCount ,

这个方法判断当modCount !=expectedModCount 时

抛出异常,如果你调用迭代器的remove方法,expectedModCount 会重新赋值,但是你调用的是list的remove方法,那么modCount 就会+1 而expectedModCount 不变,这就会造成modCount !=expectedModCount;

最后,看看为什么倒数第2个不会抛异常:

当他遍历到“n-1”时,cursor=6,然后调用remover(o)方法,size=6,这个时候调用了itr.hasNext()判断cursor是否等于size,前面说过,当cursor==size时,跳出循环,那么就不会进入next(),也就不会进入checkForComodification()方法,所以不会抛出异常,说白了,也就是循环次数少了一次。

结合着源码看,应该会比较清晰。

G. java遍历list 并删除相同值对象

用一个for循环遍历List时,不能删除其中的元素。

用Iterator操作即可。

还有 Pro类要重写一下 toString方法。这样System.out.println里才能打印出来。

import java.util.*;

public class ListTest {
public static void main(String[] args) {

List<Pro> list = new ArrayList();
Pro p1 = new Pro("1000","1000");
Pro p2 = new Pro("1001","1002");
Pro p3 = new Pro("1003","1004");
Pro p4 = new Pro("1005","1006");
list.add(p1);
list.add(p2);
list.add(p3);
list.add(p4);

for (Iterator<Pro> i = list.iterator(); i.hasNext();) {
Pro o = i.next();
if(o.getProid().equals(o.getProName())){
i.remove();
}
}
System.out.println(list);
}
}

class Pro{
private String proid;
private String proName;

public String getProid() {
return proid;
}
public void setProid(String proid) {
this.proid = proid;
}
public String getProName() {
return proName;
}
public void setProName(String proName) {
this.proName = proName;
}
public Pro(String proid, String proName) {
super();
this.proid = proid;
this.proName = proName;
}
public Pro() {
}

public String toString() {
return proid + ":" + proName;
}
}

H. java中对集合对象list的几种循环访问总结

List一共有三种遍历方法,如下:

importjava.util.ArrayList;
importjava.util.Iterator;
importjava.util.List;

publicclassMain{
publicstaticvoidmain(String[]args){
List<Integer>list=newArrayList<>();
for(inti=0;i<10;i++){
list.add(i);
}

//for循环遍历
for(inti=0,size=list.size();i<size;i++){
System.out.println(list.get(i));
}

//iterator迭代器遍历
Iterator<Integer>it=list.iterator();
while(it.hasNext()){
System.out.println(it.next());
}

//foreach循环
for(Integeri:list){
System.out.println(i);
}
}
}

数据元素是怎样在内存中存放的?

主要有2种存储方式:

1、顺序存储,Random Access(Direct Access):

这种方式,相邻的数据元素存放于相邻的内存地址中,整块内存地址是连续的。可以根据元素的位置直接计算出内存地址,直接进行读取。读取一个特定位置元素的平均时间复杂度为O(1)。正常来说,只有基于数组实现的集合,才有这种特性。Java中以ArrayList为代表。

2、链式存储,Sequential Access:

这种方式,每一个数据元素,在内存中都不要求处于相邻的位置,每个数据元素包含它下一个元素的内存地址。不可以根据元素的位置直接计算出内存地址,只能按顺序读取元素。读取一个特定位置元素的平均时间复杂度为O(n)。主要以链表为代表。Java中以LinkedList为代表。

每个遍历方法的实现原理是什么?

1、传统的for循环遍历,基于计数器的:

遍历者自己在集合外部维护一个计数器,然后依次读取每一个位置的元素,当读取到最后一个元素后,停止。主要就是需要按元素的位置来读取元素。

2、迭代器遍历,Iterator:

每一个具体实现的数据集合,一般都需要提供相应的Iterator。相比于传统for循环,Iterator取缔了显式的遍历计数器。所以基于顺序存储集合的Iterator可以直接按位置访问数据。而基于链式存储集合的Iterator,正常的实现,都是需要保存当前遍历的位置。然后根据当前位置来向前或者向后移动指针。

3、foreach循环遍历:

根据反编译的字节码可以发现,foreach内部也是采用了Iterator的方式实现,只不过Java编译器帮我们生成了这些代码。

各遍历方式的适用于什么场合?

1、传统的for循环遍历,基于计数器的:

顺序存储:读取性能比较高。适用于遍历顺序存储集合。

链式存储:时间复杂度太大,不适用于遍历链式存储的集合。

2、迭代器遍历,Iterator:

顺序存储:如果不是太在意时间,推荐选择此方式,毕竟代码更加简洁,也防止了Off-By-One的问题。

链式存储:意义就重大了,平均时间复杂度降为O(n),还是挺诱人的,所以推荐此种遍历方式。

3、foreach循环遍历:

foreach只是让代码更加简洁了,但是他有一些缺点,就是遍历过程中不能操作数据集合(删除等),所以有些场合不使用。而且它本身就是基于Iterator实现的,但是由于类型转换的问题,所以会比直接使用Iterator慢一点,但是还好,时间复杂度都是一样的。所以怎么选择,参考上面两种方式,做一个折中的选择。

I. java 中一个list循环list一段数据中某几位如果相同则去掉,这个怎么处理

你可以把已遍历的对象唯一识别码放入map,每次遍历下一个的时候,获取当前遍历的对象识别码,用作map的key,看看是否已经存在map中,如果存在就移除集合当前的对象,如果不存在,就仍旧放入map中,大致代码片段如下:
Map<String,
Integer>
uniqueMap
=
new
HashMap<String,
Integer>();
while(i<
list.size()){
Man
m
=
list.get(i)
if(uniqueMap
.get(m.getName())
!=
null){
list.remove(i);
//这里因为移除了一个,所以遍历序号不需要增加
}else{
uniqueMap
.put(m.getName(),
0);
i
++;
//这里因为没有移除,所以序号正常增加
}
}

J. 如何从Java List中取出前100的数据并且删除掉

java List中取出前100的数据并且删除掉,遍历list集合,把数据取出存到新集合,再删除掉,如下方法:

packagecom.test;

importjava.util.ArrayList;

importjava.util.List;

publicclassTestA{

publicstaticvoidmain(String[]args){

//定义集合

List<String>list=newArrayList<String>();

//给集合存150个值

for(intx=1;x<=101;x++){

list.add("a"+x);

}

System.out.println("原集合内容:"+list);

List<String>list2=newArrayList<String>();

//循环获取和移除掉100值

for(intx=0;x<1;x++){

//获取

Stringa=list.get(x);

list2.add(a);

//移除

list.remove(a);

//list2集合够100则跳出循环

if(list2.size()==100){

break;}

//移除掉list集合一个元素,长度减一,标量应该不变所以减一,后面会x++

x--;}

System.out.println("取出的100值:"+list2);

//输出剩下的值

System.out.println("剩下的list值:"+list);}

阅读全文

与java遍历删除list相关的资料

热点内容
设计道pdf 浏览:615
单片机kill4软件下载收费吗 浏览:846
苹果手机怎么连接RMS服务器 浏览:603
cisco路由器基本配置命令 浏览:186
android状态栏颜色透明 浏览:116
db2编译工具 浏览:181
腾讯云服务器创建环境 浏览:567
监管资金怎么解压 浏览:671
荣耀手机内存清理文件夹 浏览:175
外派程序员方案 浏览:554
安卓怎么把桌面的软件变成卡通 浏览:885
鲁班锁解压吗 浏览:395
打包发送文件如何加密 浏览:213
centos解压缩zip 浏览:388
我的世界怎么用命令风块取消指令 浏览:1000
安卓软件请求超时怎么办 浏览:476
androidapp调用另一个app 浏览:621
数控铣床法兰克子程序编程 浏览:174
linux打包命令targz 浏览:997
抖音app是哪个 浏览:407