0

我有一个名为 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

4 回答 4

2

看看Arrays.sort()which 接受一个Comparator你可以实现任何你想要为你的对象排序的逻辑的地方。Collections.sort()如果您想对Lists 而不是数组进行排序,还有一个。

编辑:我不太确定我在做正确的事情,但我会尝试用如何在 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,从而消除ComparatorTreeSet.

于 2013-03-22T02:00:40.247 回答
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 似乎更合适。

于 2013-03-22T02:17:53.447 回答
0

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

你会更换你的

  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 个索引。在这种情况下,安东尼出现在布赖恩之前,所以它没有。然后你检查第一个索引,但在这种情况下,亚当在布赖恩之前,所以它没有。然后检查第二个索引。啊哈!布莱恩在亚当之后,但在辛迪之前。这是将 Brian 插入数组的正确位置。现在你的数组看起来像这样。

Anthony
Adam
Brian
Cindy
Dirk

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

于 2013-03-22T02:14:56.200 回答
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;
于 2013-03-22T03:09:33.683 回答