有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何根据对象的一个属性对对象数组进行排序?

我有一个叫做Contact的对象,它有很多属性。我还有一个名为Contact_List的联系人数组,我必须为Contact_List编写一个方法,将联系人对象添加到其中。这一部分很简单,但它必须确保其中的所有联系人都基于他们的姓氏排列有序。我已经有一个名为getLastName的访问器,它返回他们姓氏的字符串,但是我如何让该方法添加联系人并对其排序?请帮忙,一个半小时后就要交了

 public void add(Contact frnd)
 {
     if(numContacts == MAX_CONTACTS) // If the List is already full
     {
      System.out.println("The Contact List is already at Maximum Capicity");
     }
     else
     {
      numContacts += 1; // There is one more Contact
      Contact_List[numContacts - 1] = frnd; // Assigns the Last Open Spot the new Contact
     }
 }

共 (4) 个答案

  1. # 1 楼答案

    看看^{},它接受一个Comparator,在这里您可以实现您想要的任何逻辑来对对象进行排序。如果您想对List而不是数组进行排序,那么还有一个Collections.sort()

    编辑: 我不太确定我做的事情是否正确,但我将尝试回答您的具体问题,我将如何在Java中实现这样的需求。但是,如果您必须在内部使用数组,并处理数组(重新)分配和手动实现排序逻辑,那么这将没有多大帮助

    private final Set<Contact> contacts = new TreeSet<Contact>( new Comparator<Contact>() {
        @Override
        public int compare(Contact c1, Contact c2) {
            return c1.getLastName().compareTo(c2.getLastName());
        }
    });
    
    public void add(Contact contact) {
        contacts.add(contact);
    }
    
    public Contact[] getContacts() {
        return contacts.toArray(new Contact[contacts.size()]);
    }
    

    此外,如果姓氏提供了这些联系人的自然顺序,我宁愿使Contact类实现Comparable,从而消除了向TreeSet提供Comparator的需要

  2. # 2 楼答案

    对于您的示例,您可以做的最简单的事情是在将元素添加到数组中时对元素进行排序

    你会取代你的

      numContacts += 1; // There is one more Contact
      Contact_List[numContacts - 1] = frnd; // Assigns the Last Open Spot the new Contact
    

    使用遍历数组并找到插入项的正确位置的代码。而不是简单地将项目放在末尾

    例如,假设数组中有四个人的姓氏

    Anthony
    Adam
    Cindy
    Dirk
    

    现在您插入联系人Brian

    您可能希望循环单步遍历数组,检查第一个位置是否属于第0个索引。在本例中,Anthony在Brian之前,所以它不在。然后你检查第一个索引,但在本例中,Adam在Brian之前,所以它不在。然后你检查第二个索引。啊哈!布莱恩在亚当之后,但在辛迪之前。这是将Brian插入阵列的正确位置。现在,您的数组如下所示

    Anthony
    Adam
    Brian
    Cindy
    Dirk
    

    如果以这种方式编写“insert”方法,则可以保证在添加项时数组始终保持排序。通过使用ArrayList而不是数组,您的生活将变得更加轻松。在我使用Java的所有时间里,我99.9%的时间都在使用ArrayList

  3. # 3 楼答案

    简单的解决方案是在下一个位置添加联系人(正如您现在所做的),然后在添加后对数组进行排序,使其始终按正确的排序顺序排列:

    添加最后一个联系人后,使用自定义比较器进行排序:

    if (numContacts == MAX_CONTACTS) {
    Arrays.sort(contacts, new Comparator<Contact>() {
        public int compare(Contact o1, Contact o2) {
            return o1.getLastName().compareTo(o2.getLastName());
        }
    });
    }
    


    此外,这两条线:

    numContacts += 1;
    Contact_List[numContacts - 1] = frnd;
    

    可以简单地替换为:

    Contact_List[numContacts++] = frnd;
    
  4. # 4 楼答案

    这可能行得通

    public static void add(Contact frnd) {
        if (contactList.length == MAX_CONTACTS) {
            throw new IllegalStateException("The Contact List is already at Maximum Capicity");
        }
        int i = Arrays.binarySearch(contactList, frnd, new Comparator<Contact>() {
            public int compare(Contact o1, Contact o2) {
                return o1.getLastName().compareTo(o2.getLastName());
            }
        });
        if (i < 0) {
            i = -i - 1;
        }
        Contact[] temp = new Contact[contactList.length + 1];
        System.arraycopy(contactList, 0, temp, 0, i);
        temp[i] = frnd;
        if (i < contactList.length) {
            System.arraycopy(contactList, i, temp, i + 1, contactList.length - i);
        }
        contactList = temp;
    }
    

    但对于这个任务列表或树集似乎更合适