如何根据其中一个属性订购对象数组?

时间:2013-03-22 01:57:21

标签: java

我有一个名为Contact的对象,它有一堆属性。我还有一个名为Contact_List的联系人数组,我必须为Contact_List编写一个方法,它将向其添加一个Contact对象。这部分很简单,但必须确保其中的所有联系人都根据其姓氏排序。我已经有一个名为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 个答案:

答案 0 :(得分:2)

查看接受Comparator的{​​{3}},您可以在其中实现订购对象所需的任何逻辑。如果您想要排序Collections.sort()而不是数组,还有一个List

编辑: 我不太确定我做的是正确的,但我会尝试回答你的具体问题,我将如何在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,从而无需提供{ {1}} Comparator

答案 1 :(得分:1)

这可行吗

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;
}

但是对于这个任务,List或TreeSet似乎更合适。

答案 2 :(得分:0)

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

你会替换你的

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

使用遍历数组的代码并找到插入项目的正确位置。 INSTEAD简单地将项目放在最后。

例如,假设您的阵列中有四个人使用这些姓氏。

Anthony
Adam
Cindy
Dirk

现在您插入联系人Brian

您希望循环遍历数组,检查第一个位置以查看它是否属于第0个索引。在这种情况下,安东尼来到布莱恩之前,所以它没有。然后你检查第一个索引,但在这种情况下,Adam来到Brian之前,所以它没有。然后检查第二个索引。啊哈!布莱恩来自亚当,但在辛迪之前。这是将Brian插入数组的正确位置。现在你的数组看起来像这样。

Anthony
Adam
Brian
Cindy
Dirk

如果你写&#34;插入&#34;通过这种方式,您可以保证在添加项目时数组始终保持排序状态。通过使用ArrayList而不是数组,您的生活将变得更轻松。在我使用Java的所有时间里,我曾经99.9%的时间使用ArrayList而不是阵列。

答案 3 :(得分:0)

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

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

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;