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

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

我有一个叫做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
     }
 }
看看哪一个接受
比较器
,在这里您可以实现您想要的任何逻辑来对对象进行排序。如果要对
列表而不是数组进行排序,还可以使用
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()]);
}
private final Set contacts=新树集(新比较器(){
@凌驾
公共int比较(触点c1、触点c2){
返回c1.getLastName().compareTo(c2.getLastName());
}
});
公共无效添加(联系人){
联系人。添加(联系人);
}
公共联系人[]获取联系人(){
返回contacts.toArray(新联系人[contacts.size()]);
}
此外,如果姓氏提供了这些联系人的自然顺序,我宁愿让
Contact
类实现
Comparable
,这样就不需要为
树集提供
比较器

,看看哪个类接受
比较器
,在那里可以实现任何逻辑来排序对象。如果要对
列表而不是数组进行排序,还可以使用
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()]);
}
private final Set contacts=新树集(新比较器(){
@凌驾
公共int比较(触点c1、触点c2){
返回c1.getLastName().compareTo(c2.getLastName());
}
});
公共无效添加(联系人){
联系人。添加(联系人);
}
公共联系人[]获取联系人(){
返回contacts.toArray(新联系人[contacts.size()]);
}

此外,如果姓氏提供了这些联系人的自然顺序,我宁愿让
Contact
类实现
compariable
,这样就不需要为
树集提供
比较器
,对于您的示例,您可以做的最简单的事情就是在将元素添加到数组中时对它们进行排序

你会取代你的

  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之前,所以它不是。然后你检查第一个索引,但是在这个例子中亚当在布赖恩之前,所以它没有。然后检查第二个索引。啊哈!布莱恩在亚当之后,但在辛迪之前。这是将Brian插入阵列的正确位置。现在,您的数组如下所示

Anthony
Adam
Brian
Cindy
Dirk

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

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

你会取代你的

  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之前,所以它不是。然后你检查第一个索引,但是在这个例子中亚当在布赖恩之前,所以它没有。然后检查第二个索引。啊哈!布莱恩在亚当之后,但在辛迪之前。这是将Brian插入阵列的正确位置。现在,您的数组如下所示

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

这可能会奏效

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;
}
公共静态无效添加(联系frnd){
if(contactList.length==MAX_CONTACTS){
抛出新的非法状态异常(“联系人列表已达到最大容量”);
}
int i=Arrays.binarySearch(contactList,frnd,newcomparator(){
公共int比较(联系人o1,联系人o2){
返回o1.getLastName().compareTo(o2.getLastName());
}
});
if(i<0){
i=-i-1;
}
联系人[]温度=新联系人[contactList.length+1];
系统阵列副本(联系人列表,0,温度,0,i);
温度[i]=frnd;
如果(i
但是对于这个任务列表或树集似乎更合适