Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何按字母顺序排列包含多个对象的数组?_Java - Fatal编程技术网

Java 如何按字母顺序排列包含多个对象的数组?

Java 如何按字母顺序排列包含多个对象的数组?,java,Java,我有一个任务是这样的: 创建一个用作通讯簿的程序。它应该有包含以下信息的条目:姓名、电话号码和电子邮件地址。条目应按姓氏排序。每个新联系人的插入方式都将保持字母顺序。每次更改时,都需要显示所有条目 我在这个网站上读了好几篇文章,但是没有一篇有效,我尝试了排序方法,但是没有成功 编辑:嗨!我尝试了你的建议,现在打印成这样,我也更新了代码。 [com.mycompany.test]。contact@b4c966a,com.mycompany.test。contact@2f4d3709,com.myc

我有一个任务是这样的: 创建一个用作通讯簿的程序。它应该有包含以下信息的条目:姓名、电话号码和电子邮件地址。条目应按姓氏排序。每个新联系人的插入方式都将保持字母顺序。每次更改时,都需要显示所有条目

我在这个网站上读了好几篇文章,但是没有一篇有效,我尝试了排序方法,但是没有成功

编辑:嗨!我尝试了你的建议,现在打印成这样,我也更新了代码。 [com.mycompany.test]。contact@b4c966a,com.mycompany.test。contact@2f4d3709,com.mycompany.test。contact@4e50df2e]

公共类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;
    }
}