【问题标题】:How do you arrange an array with multiple objects alphabetically? [closed]如何按字母顺序排列包含多个对象的数组? [关闭]
【发布时间】:2020-11-11 23:18:04
【问题描述】:

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

我在这个网站上看了几篇文章都没有用,我尝试了排序方法但没有用。

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

public class NewClass {
   
    
   
     String firstname;
    int phone;
     String email;
    int i=0;
    
    public static void main(String[]args){
        String lastname;
        String firstname;
        int phone;
        String email;
         
        Scanner scanner = new Scanner(System.in);
      
        contact[] contacts = new contact[3];
        
        
        for(int i=0; i<contacts.length; i++){
        System.out.println("Please enter Last name:");
         
           lastname = scanner.next();
            
         
            System.out.println("Please enter sFirst name:");
         
        firstname = scanner.next();
         
         System.out.println("Please enter Phone number:");
         
          phone = scanner.nextInt();
         
       
            
          System.out.println("Please enter Email address:");
         
         email  = scanner.next();
         
   
           contacts[i] = new contact(lastname,firstname, phone, email);
          
           
  
            }
          Arrays.sort(contacts);
            
        
         for (int i=0; i<contacts.length; i++) {
             
             System.out.println(Arrays.toString(contacts));
         }
            
  
    
}
    
}

公共类联系人实现 Comparable {

private String lastname;
private String firstname;
private int phone;
private String email;






public contact(String lastname, String firstname, int phone, String email){
this.lastname=lastname;
this.firstname=firstname;
this.phone=phone;
this.email=email;
}

public String getlastname(){
return lastname;
}

 
public String getfirstname(){
return firstname;
}

 
public int phone(){
return phone;
}
 
public String getlastemail(){
return email;
}

@Override
public int compareTo(contact contact){
    
    return lastname.compareTo(contact.lastname);
}

public String tostring(){

    return "Lastname: "+  this.lastname + "Firstname: " + this.firstname + "Phonenumber :" + this.phone  + "Email: " + this.email; 
}

}

【问题讨论】:

  • 您应该解释“它们都不起作用”和“我尝试了排序方法但它不起作用。”。结果如何?

标签: java


【解决方案1】:

您需要实现 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;
    }
}

【讨论】:

  • 我要说的是,这远远超出了 OP 真正需要的。他们承认他们是编程新手,这是课堂作业。很可能,讲师不喜欢这种从菜鸟那里获得的东西,并且可能会因为超出课程范围以及从互联网上剽窃他们的代码而让他们陷入困境。这是很好的代码,但您还必须考虑 OP 实际需要和可以使用的内容。
  • @computercarguy 但这意味着此答案仅适用于该一个用户。它不是。它适用于所有想要回答这个问题的人。人们如何使用它取决于他们。
  • @Scratte,所以说真的,这并不能回答 OP 的问题,因为他们可能无法使用它。我知道想要为“每个人”提供答案,但有时答案只是针对问题。 OP 询问有关其代码的特定问题,因此答案应该特定于他们的代码,而不是“无处不在的所有代码”。这就像将 C# 或 JavaScript 代码发布到此 Q,即使它特定于 Java。它回答了其他人的问题,但不是真正的 OP。
  • @computercarguy 我明白你在说什么,虽然这篇文章被标记为“java”:)
  • @Scratte,是的,我看过其他帖子,在各种答案中有 5-6 种不同的语言,尽管 Q 也指定了一种语言。我只是说,如果 OP 出于某种原因不能使用 Answer,那么这对 OP 没有任何好处。
【解决方案2】:

我已经有一段时间没有进行 Java 编程了,但是我可以提供很多格式化和一些语法建议,但目前这不是主题。我对 Q 进行了编辑,以使某些内容更易于阅读,包括将代码放入代码块中(如果获得批准)。

首先要做的是:

您的数组排序在循环中,这是不应该的。只有在完成所有输入后,您才应该这样做。至少在这种情况下。有时可能适合将排序放入循环中,但这次不行。

其次:

您还需要将println 移到循环之外,这意味着您需要创建一个新循环来显示所有contacts。您可以重用 i 变量,因为它超出了第一个循环的范围,因此修改该变量的其他用途没有问题。

如果您对此有任何疑问,也可以查看以下问题。

List an Array of Strings in alphabetical order

第三:

我说过我不会谈论格式,但我会简要介绍一下。您的 contact 变量的名称应该与您的 contact 类的名称不同。即使这意味着将类名大写,这对于大多数情况来说应该已经足够了,至少在你还在学习的时候。对于经验丰富的专业人士来说,这通常不是好事,但有时还是会发生。但应该很少见。

另外,您可以创建一个空白contact 的新实例,然后简单地将值直接分配给该对象,而不是使用额外的变量。这些变量可能会保留泄露给其他contact 的数据。以下问题显示了如何将元素添加到现有数组。大约是ints,但它对所有数组都一样。

Adding integers to an int array

这个问题是关于如何从对象属性分配给变量。这与你正在做的相反,但你只需要扭转分配。他们的例子是double height1 = oldRectangle.height;,所以倒过来就是oldRectangle.height = height1;

How to assign an object property value to a variable in Java?

由于您不包含 contact 类定义,我不知道具体情况,但我猜您可以这样做:

Contact newContact = new Contact(); // at the beginning of the loop
...
newContact.LastName = scanner.next();
...
newContact.FirstName = scanner.next();
...
newContact.Phone = scanner.next();
...
newContact.Email= scanner.next();
...
contact.Add(newContact); // at the end of the loop

这还假设新的contact 不需要这些参数,您可以只创建一个空白contact。如果它确实需要这些参数,您仍然可以这样做,但改为使用new Contact("", "", "", "");。这可能会惹恼您的教师,或者可能是作业要求使用变量和当前实例化,而我的建议领先于您当前的学习点。

嗯,这不是那么简短。对不起。我相信你的教授/老师/讲师稍后会教你更多关于正确格式和其他最佳实践的知识,所以我真的不会比我已经拥有的更进一步。

【讨论】:

    猜你喜欢
    • 2018-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    • 1970-01-01
    • 2015-08-25
    • 2013-07-14
    • 1970-01-01
    相关资源
    最近更新 更多