我正在尝试从 ArrayList 中删除对象 键入 Contact 类。我正在尝试从用户那里获取输入并希望 从 ArrayList 中删除该对象
public class Contacts {
private String name, phoneNumber;
public Contacts(){
}
public Contacts(String name, String phoneNumber) {
this.name = name;
this.phoneNumber = phoneNumber;
}
public String getName() {
return name;
}
public String getPhoneNumber() {
return phoneNumber;
}
@Override
public String toString() {
return "Contacts{" +
"name='" + name + '\'' +
", phoneNumber='" + phoneNumber + '\'' +
'}';
}
public static Contacts createContact(String name, String phoneNumber) {
return new Contacts(name, phoneNumber);
}
}
在这里,我尝试添加带有名称和编号的对象,然后打印它们,我想删除一个特定的对象。
public class Mobile {
ArrayList<Contacts> mycontacts;
public Mobile() {
this.mycontacts = new ArrayList<Contacts>();
}
public void addContacts() {
System.out.println("enter contact name");
Scanner sc = new Scanner(System.in);
String name = sc.nextLine();
System.out.println("enter contact number");
String number = sc.nextLine();
Contacts contacts = new Contacts(name, number);
mycontacts.add(contacts);
}
public void print() {
for (Contacts contacts : mycontacts) {
System.out.println(contacts.getName() + "->" + contacts.getPhoneNumber());
}
}
public String findcontact() {
Scanner scanner = new Scanner(System.in);
System.out.println("enter contact name");
String name = scanner.nextLine();
System.out.println("enter phone number");
String number = scanner.nextLine();
Contacts contacts = new Contacts(name, number);
int x = mycontacts.indexOf(contacts);
return mycontacts.get(x).getName();
}
public void remove() {
Scanner scanner = new Scanner(System.in);
System.out.println("enter contact name");
String name = scanner.nextLine();
System.out.println("enter contact number");
String number = scanner.nextLine();
Contacts contacts = new Contacts(name, number);
Iterator<Contacts> itr = mycontacts.iterator();
while (itr.hasNext()){
Contacts contacts1 = itr.next();
System.out.println(contacts1);
if (contacts1==contacts){
itr.remove();
}
}
}
}
答案 0 :(得分:0)
你需要在你的 Contacts 类上实现 equals 方法,就像这样
public boolean equals(Object other){
if(other instanceof Contract){
Contract otherC = (Contract)other;
return this.name.equals(otherC.name) && this.phoneNumber.equals(otherC.phoneNumber);
}
return false;
}
答案 1 :(得分:0)
Java 不是我的强项,但我认为你可以这样解决它:
Iterator<Contacts> itr = mycontacts.iterator();
while (itr.hasNext()){
Contacts contacts1 = itr.next();
System.out.println(contacts1);
if (contacts1.getName()==contacts.getName() && contacts1.getPhoneNumber() == contacts.getPhoneNumber()){
itr.remove();
}
}
或简化:
mycontacts.removeIf(i -> i.getName()==contacts.getName() && i.getPhoneNumber()==contacts.getPhoneNumber());
我认为在这个比较中发生的事情是:if (contacts1==contacts)
它们永远不会相等,因为它们是不同的对象,但它们的类变量具有相同的值。
https://www.baeldung.com/java-comparing-objects
<块引用>这些对象的值不是 1。而是它们在堆栈中的内存地址不同,因为这两个对象都是使用 new 运算符创建的。
编辑:实际上,在我回答时出现了另一个答案,这是更好的。因为我想我给出了更多解释,所以我就不说了。
答案 2 :(得分:0)
有两种方法可以从 ArrayList 中删除元素:
remove(Object object)
remove(int index)
因此,如果您使用 name
作为键,它可能类似于:
public void removeContact(String name) {
for(contact : mycontacts) {
if(contact.name == name) {
mycontacts.remove(contact)
}
}
}
答案 3 :(得分:0)
我尝试使用以下代码,它奏效了。感谢所有帮助过我的人。 :)
for (Contacts mycontact : mycontacts) {
if (mycontact.getName().equals(name)) {
System.out.println("removed contact"+mycontact.getName()+"->"+mycontact.getPhoneNumber());
mycontacts.remove(mycontact);
}
else{
System.out.println("error deleting contact");
}
}