Java 从ArrayList中删除具有特定值的项
我已经创建了一个对象列表,并向其中添加了人员:Java 从ArrayList中删除具有特定值的项,java,arraylist,Java,Arraylist,我已经创建了一个对象列表,并向其中添加了人员: ArrayList<Person> peeps = new ArrayList<Person>(); peeps.add(new Person("112", "John", "Smith")); peeps.add(new Person("516", "Jane", "Smith")); peeps.add(new Person("114", "John", "Doe")); ArrayList peeps=new A
ArrayList<Person> peeps = new ArrayList<Person>();
peeps.add(new Person("112", "John", "Smith"));
peeps.add(new Person("516", "Jane", "Smith"));
peeps.add(new Person("114", "John", "Doe"));
ArrayList peeps=new ArrayList();
添加(新人物(“112”、“约翰”、“史密斯”);
添加(新人物(“516”、“简”、“史密斯”);
添加(新的人(“114”、“约翰”、“Doe”);
我正试图找出如何从名单中删除的人的ID号码。所以如果我想除掉身份证号码为114的人,但现在不知道它在列表中的位置,如何?
在ArrayList
元素中迭代
,并删除与要删除的字符串匹配的元素:迭代器删除
操作是安全的,不会创建ConcurrentModificationException
for (Iterator<String> iterator = peeps.iterator(); elementToCheck = iterator.next();) {
if (elementToCheck.getId().equals("112")) {
// Remove the current element from the iterator and the list.
iterator.remove();
}
}
for(迭代器迭代器=peeps.Iterator();elementToCheck=Iterator.next();){
if(elementToCheck.getId()等于(“112”)){
//从迭代器和列表中删除当前元素。
iterator.remove();
}
}
使用Java8:
peeps.removeIf(p -> p.getId().equals("112"));
请注意,这相当于线性搜索,需要O(n)
时间。如果频繁重复此操作,建议使用哈希映射
,以将速度提高到O(1)
或者,使用排序列表也可以做到这一点,但需要
O(logn)
时间。您首先需要在Person类中有一个工作等于
(您应该这样做)。然后您可以使用List#indexOf
和List#remove
。例如:
final Person toRemove = new Person("112");
peeps.remove(peeps.indexOf(toRemove));
(假设人员ID是唯一的)
或者,如果列表是ArrayList
,则可以使用ArrayList#remove(Object)
:
如果您使用的是Java 8,则可以使用。如果您要使用ArrayList,唯一的方法是浏览整个列表,查看每个人,并查看其id号为114。对于较大的数据集,这将不会有效率,应该避免 如果您可以更改您的数据结构,那么采用某种方式会更好(通常是一个不错的选择)。您可以将id号作为“密钥”,然后将其与每个人关联。以后可以按键查询地图。缺点是你只能有一个值作为一个键,所以你不能同时拥有name和id-number键 编辑:
使用ArrayList的一种更有效的方法是按id号对其进行排序。然后您可以使用类似的方法通过id号快速访问元素。缺点是从排序数组中删除/插入的代价很高,因为元素中较大的所有内容都必须移动。因此,如果与读取次数相比,您要做的更改相对较少,那么这可能是可行的有很多方法可以解决这个问题
CollectionUtils.select(peeps,new Predicate(){
@凌驾
公共布尔求值(Person对象){
返回object.getId().equals(“114”);
}
});
Iterator Iterator=peeps.Iterator();
while(iterator.hasNext()){
Person next=迭代器.next();
if(next.getId().equals(“114”)){
iterator.remove();
}
}
类处理器{
ArrayList peeps=新的ArrayList();
void setPeeps(){
peeps.add(新人(112,“约翰”、“史密斯”);
peeps.add(新人(516,“简”,“史密斯”);
peeps.add(新的人(114,“约翰”,“多伊”));
}
无效删除人(内部id){
对于(int i=0;i如果要搜索字符串,则应使用.equals
String query;
ArrayList<String> list;
for(int i=0; i < list.size();i++)
if (list.get(i).equals(query)){
list.remove(i);
break;
}
字符串查询;
数组列表;
对于(int i=0;i
你必须使用ArrayList吗?你最好使用HashMap。你没有为你的问题选择正确的数据结构。使用Map
,而不是列表
。你能扩展你的Person类吗?@lacraig2Map
@m0skit0 true。这是一个字符串。这样存储整数有点奇怪,但它是一个string、 使用Java 8 lambda表达式和新功能的很好。很好,它是直接使用的。很好地使用了SE 8!为我省去了大量的麻烦,需要通过迭代来删除该对象。真的。我更改了它。迭代器删除是安全的,不会导致此异常。您只需将elementToCheck=Iterator.next()
中的for
;)正确:D更改了它;-)回答不错,但这不是唯一的方法。关于地图的建议很好。我不仅在这里键入了代码。我在STS上尝试了它,运行了它,然后复制了它。你能在这里发布你的错误吗?我再试了一次,效果很好!@JobinThomas尝试删除除最后一个之外的任何条目!(假设您仍在阅读网站)
CollectionUtils.select(peeps, new Predicate<Person>() {
@Override
public boolean evaluate(Person object) {
return object.getId().equals("114");
}
});
Iterator<Person> iterator = peeps.iterator();
while(iterator.hasNext()) {
Person next = iterator.next();
if(next.getId().equals("114")) {
iterator.remove();
}
}
class Processor{
ArrayList<Person> peeps = new ArrayList<Person>();
void setPeeps(){
peeps.add(new Person(112, "John", "Smith"));
peeps.add(new Person(516, "Jane", "Smith"));
peeps.add(new Person(114, "John", "Doe"));
}
void removePerson(int id){
for(int i=0; i <= peeps.size(); i++){
Person person = peeps.get(i);
if(person.id == id)
peeps.remove(peeps.get(i));
}
}
void displayPersonsList(){
for(Person person : peeps){
System.out.println(person.id + ":" + person.fName + ":" + person.lName);
}
}
public static void main(String args[]){
Processor objProcessor = new Processor();
objProcessor.setPeeps();
objProcessor.removePerson(114);
objProcessor.displayPersonsList();
}
}
class Person{
int id;
String fName;
String lName;
public Person(int id, String fName, String lName){
this.id = id;
this.fName = fName;
this.lName = lName;
}
}
String query;
ArrayList<String> list;
for(int i=0; i < list.size();i++)
if (list.get(i).equals(query)){
list.remove(i);
break;
}