Java 如何按字母顺序排列包含多个对象的数组?
我有一个任务是这样的: 创建一个用作通讯簿的程序。它应该有包含以下信息的条目:姓名、电话号码和电子邮件地址。条目应按姓氏排序。每个新联系人的插入方式都将保持字母顺序。每次更改时,都需要显示所有条目 我在这个网站上读了好几篇文章,但是没有一篇有效,我尝试了排序方法,但是没有成功 编辑:嗨!我尝试了你的建议,现在打印成这样,我也更新了代码。 [com.mycompany.test]。contact@b4c966a,com.mycompany.test。contact@2f4d3709,com.mycompany.test。contact@4e50df2e]Java 如何按字母顺序排列包含多个对象的数组?,java,Java,我有一个任务是这样的: 创建一个用作通讯簿的程序。它应该有包含以下信息的条目:姓名、电话号码和电子邮件地址。条目应按姓氏排序。每个新联系人的插入方式都将保持字母顺序。每次更改时,都需要显示所有条目 我在这个网站上读了好几篇文章,但是没有一篇有效,我尝试了排序方法,但是没有成功 编辑:嗨!我尝试了你的建议,现在打印成这样,我也更新了代码。 [com.mycompany.test]。contact@b4c966a,com.mycompany.test。contact@2f4d3709,com.myc
公共类NewClass{
字符串名;
国际电话;
字符串电子邮件;
int i=0;
公共静态void main(字符串[]args){
字符串lastname;
字符串名;
国际电话;
字符串电子邮件;
扫描仪=新的扫描仪(System.in);
联系人[]联系人=新联系人[3];
对于(inti=0;i,您需要实现Comparable或Comparator接口,并重写它们各自的方法
另外,使用TreeSet维护通讯簿。所有新添加的联系人都将自动排序。我创建了一个快速示例:-
import java.lang.Comparable;
import java.util.*;
public class ContactTester{
public static void main(String args[]){
Contact c1 = new Contact("PA" , "GC", "000-987-9876","a@b.com");
Contact c2 = new Contact("VA" , "AA", "000-987-9876","a@b.com");
Contact c3 = new Contact("SA" , "AA", "000-987-9876","a@b.com");
Contact c4 = new Contact("AC" , "AB", "000-987-9876","a@b.com");
TreeSet<Contact> addressBook = new TreeSet();
addressBook.add(c1);
addressBook.add(c2);
addressBook.add(c3);
addressBook.add(c4);
for (Contact c : addressBook)
System.out.println(c.toString());
Contact c5 = new Contact("TT" , "AT", "000-987-9876","a@b.com");
addressBook.add(c5);
for (Contact c : addressBook)
System.out.println("after " + c.toString());
}
}
class Contact implements Comparable<Contact>{
private String firstname;
private String lastname;
private String phoneNumber;
private String email;
public Contact(String firstname, String lastname, String phoneNumber, String email){
this.firstname = firstname;
this.lastname = lastname;
this.phoneNumber = phoneNumber;
this.email = email;
}
@Override
public int compareTo(Contact contact){
int last = this.lastname.compareTo(contact.lastname);
return last ==0 ? this.firstname.compareTo(contact.firstname) : last;
}
@Override
public String toString(){
return "firstname "+ this.firstname + " lastname " + this.lastname + " phoneNumber " + this.phoneNumber + " email " + this.email;
}
}
import java.lang.Comparable;
导入java.util.*;
公共类接触测试仪{
公共静态void main(字符串参数[]){
触点c1=新触点(“PA”、“GC”、“000-987-9876”和“a@b.com");
触点c2=新触点(“VA”、“AA”、“000-987-9876”和“a@b.com");
触点c3=新触点(“SA”、“AA”、“000-987-9876”和“a@b.com");
触点c4=新触点(“AC”、“AB”、“000-987-9876”和“a@b.com");
TreeSet addressBook=新的TreeSet();
地址簿.add(c1);
地址簿.add(c2);
地址簿.add(c3);
地址簿.add(c4);
收件人(联系人c:通讯簿)
System.out.println(c.toString());
触点c5=新触点(“TT”、“AT”、“000-987-9876”和a@b.com");
地址簿。添加(c5);
收件人(联系人c:通讯簿)
System.out.println(“在“+c.toString()之后”);
}
}
类联系人实现了可比较的{
私有字符串名;
私有字符串lastname;
私有字符串电话号码;
私人字符串电子邮件;
公共联系人(字符串firstname、字符串lastname、字符串phoneNumber、字符串email){
this.firstname=firstname;
this.lastname=lastname;
this.phoneNumber=电话号码;
this.email=电子邮件;
}
@凌驾
公共int比较(联系人){
int last=this.lastname.compareTo(contact.lastname);
return last==0?this.firstname.compareTo(contact.firstname):last;
}
@凌驾
公共字符串toString(){
返回“firstname”+this.firstname+“lastname”+this.lastname+“phoneNumber”+this.phoneNumber+“email”+this.email;
}
}
我已经有一段时间没有做Java编程了,但是我可以给出很多格式和语法建议,但这不是我目前的主题。我编辑了Q,以便更好地阅读一些内容,包括将代码放在代码块中(如果获得批准的话)
所以首先要做的是:
你的数组排序在循环中,它不应该在循环中。你应该在完成所有输入后才这样做。至少在这种情况下是这样。有时将排序放入循环中是合适的,但这次不合适
第二:
您还需要将println
移到循环之外,这意味着您需要创建一个新的循环来显示所有联系人
s。您可以重用i
变量,因为它将超出第一个循环的范围,因此该变量的其他用途不会受到影响
如果您对此有任何疑问,也可以查看下面的问题
第三:
我说过我不打算谈论格式化,但我将简要介绍一下。你的contact
变量应该是与你的contact
类不同的名称。即使这意味着将类名大写,至少在你还在学习的时候,这对大多数情况来说已经足够了。这通常对seaso不好ned很专业,但有时还是会发生,但应该很少发生
此外,您还可以创建空白联系人的新实例,然后直接将值分配给该对象,而不是使用额外的变量。这些变量可能会保留泄漏给其他联系人的数据。下面的问题显示如何将元素添加到现有数组中。这是关于int
s,但它对所有阵列都是一样的
这个问题是关于如何从对象属性赋值给变量的。这与您所做的相反,但是您只需要反转赋值。他们的示例是double height1=oldRectangle.height;
,因此反转它将是oldRectangle.height=height1;
由于您没有包含联系人
类定义,我不知道具体内容,但我猜您可以这样做:
Contact newContact=newContact();//在循环的开始处
...
newContact.LastName=scanner.next();
...
newContact.FirstName=scanner.next();
...
newContact.Phone=scanner.next();
...
newContact.Email=scanner.next();
...
contact.Add(newContact);//在循环的末尾
这还假设一个新的联系人不需要这些参数,您只需创建一个空白的联系人
。如果它确实需要这些参数,您仍然可以这样做,但改为创建新联系人(“,”,“,”,”);
。这可能会让您的讲师感到烦恼,或者可能是
import java.lang.Comparable;
import java.util.*;
public class ContactTester{
public static void main(String args[]){
Contact c1 = new Contact("PA" , "GC", "000-987-9876","a@b.com");
Contact c2 = new Contact("VA" , "AA", "000-987-9876","a@b.com");
Contact c3 = new Contact("SA" , "AA", "000-987-9876","a@b.com");
Contact c4 = new Contact("AC" , "AB", "000-987-9876","a@b.com");
TreeSet<Contact> addressBook = new TreeSet();
addressBook.add(c1);
addressBook.add(c2);
addressBook.add(c3);
addressBook.add(c4);
for (Contact c : addressBook)
System.out.println(c.toString());
Contact c5 = new Contact("TT" , "AT", "000-987-9876","a@b.com");
addressBook.add(c5);
for (Contact c : addressBook)
System.out.println("after " + c.toString());
}
}
class Contact implements Comparable<Contact>{
private String firstname;
private String lastname;
private String phoneNumber;
private String email;
public Contact(String firstname, String lastname, String phoneNumber, String email){
this.firstname = firstname;
this.lastname = lastname;
this.phoneNumber = phoneNumber;
this.email = email;
}
@Override
public int compareTo(Contact contact){
int last = this.lastname.compareTo(contact.lastname);
return last ==0 ? this.firstname.compareTo(contact.firstname) : last;
}
@Override
public String toString(){
return "firstname "+ this.firstname + " lastname " + this.lastname + " phoneNumber " + this.phoneNumber + " email " + this.email;
}
}