删除对象用的方法:
public E remove(int index)
定义:
删除指定索引处的对象,返回被修改的元素
格式:
public :修饰符
E:引用类型
remove:方法名
int index:需要删除位置的索引值,索引从0开始
对象:
public E remove(int index)方法格式用于集合之中
举例说明:
需求:
1.定义类,包含以下成员:
1.1成员属性: name (姓名):String类型,age (年龄):int类型, like (爱好):String类型,属性使⽤private修饰。
1.2⽣成⽅法:
1).get/set⽅法
2)有参构造⽅法
2.定义类:Test,类中定义main()⽅法,按以下要求编写代码:
2.1分别实例化六个Singer对象,六个对象的属性分别为: "xxx" ,25,”打篮球”、"xxx" ,35,”游泳”、"xxx" ,19,”踢⾜球”、"xxxx" ,1 8,”击剑”、"xxxxx" ,22,”滑雪”、"xx" ,19,”拳击”;
2.2创建⼀个ArrayList集合,这个集合⾥⾯存储的是Singer类型,分别将上⾯的六个对象添加到集合中 ;
2.3遍历这个集合,在遍历的过程中,如果集合中对象的年龄⼤于30,那么将这个对象的爱好改成”***”,如果对象的姓名字符数大于等于4个时, 那么就把这个对象删除。
2.4正确修改和删除对象后,遍历集合,打印集合⾥所有对象的所有属性信息到控制台。
定义Demo类:
public class Demo {
private String name;
private int age;
private String like;
public Demo() {
}
public Demo(String name, int age, String like) {
this.name = name;
this.age = age;
this.like = like;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getLike() {
return like;
}
public void setLike(String like) {
this.like = like;
}
}
定义DemoTest测试类:
import java.util.ArrayList;
public class DemoTest {
public static void main(String[] args) {
Demo s1=new Demo("xxx",25,"打篮球");
Demo s2=new Demo("xxx",35,"游泳");
Demo s3=new Demo("xxx",19,"踢足球");
Demo s4=new Demo("xxxx",18,"击剑");
Demo s5=new Demo("xxxxx",22,"滑雪");
Demo s6=new Demo("xx",19,"拳击");
ArrayList<Demo> list=new ArrayList<>();
list.add(s1);
list.add(s2);
list.add(s3);
list.add(s4);
list.add(s5);
list.add(s6);
list=Updata(list);
list=Delete(list);
for (int i = 0; i <list.size(); i++) {
System.out.print("姓名:"+list.get(i).getName()+"\t年龄:"+list.get(i).getAge()+"\t爱好:"+list.get(i).getLike()+"\n");
}
}
//定义修改方法
public static ArrayList Updata(ArrayList<Demo> list){
for (int i = 0; i <list.size(); i++) {
//获得集合中的相应索引对应的对象用get方法取出年龄的值
if (list.get(i).getAge() > 30) {
list.get(i).setLike("***");
}
}
return list;
}
//定义删除方法
public static ArrayList Delete(ArrayList<Demo> list){
for (int i = 0; i <list.size(); i++) {
//获取集合中相应索引对象用get方法取出姓名的字符串并求出字符串长度
if(list.get(i).getName().length()>=4){
list.remove(i);
}
}
return list;
}
}
运行结果:
程序存在的问题:
我们发现在集合中我们想要删除的内容并没有删除干净,原因是在删除方法中当已经删除成功第一个对象后,集合的长度发生改变,从删除的第一个满足条件的对象位置开始,之后的对象索引都会向前移动,当集合内满足条件的对象相邻时,成功删除完一个后,后一个对象的索引向前移动,而循环内的局部变量又是每次循环结束后都自加或自减的,因此就会跳过这个对象对后面的对象进行相同操作。
解决办法:
在执行删除操作的循环体的判断语句里加上局部变量自减1就行了
相应代码:
//定义删除方法
public static ArrayList Delete(ArrayList<Demo> list){
for (int i = 0; i <list.size(); i++) {
if(list.get(i).getName().length()>=4){
list.remove(i);
i--; //改进办法
}
}
return list;
}
运行结果: