2013-03-22 215 views
0

我有一个叫做Contact的对象,它有一堆属性。我还有一个名为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 
    } 
} 
+0

下面是一个例子:http://stackoverflow.com/questions/1946668/sorting-using-comparator-descending-order-user-defined-classes/1947527# 1947527 – camickr 2013-03-22 02:16:14

回答

2

看一看Arrays.sort()它接受一个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,从而消除了需要提供ComparatorTreeSet

+0

我一直在试图弄清楚如何正确编码几个小时......你如何编码它? – 2013-03-22 02:03:45

+1

你是否需要**这是一个数组?因为有一些数据结构可以更有效地完成这项任务,比如'TreeSet'。并且您可以随时将其转换为数组... – 2013-03-22 02:08:07

+0

此外,您是否尝试使用Google搜索功能? https://www.google.com/search?q=java+comparator+example。我希望我不会帮你欺骗一些东西...... :) – 2013-03-22 02:10:52

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之前,所以它没有。然后你检查第一个索引,但在这种情况下,Adam在Brian之前,所以它没有。然后你检查第二个索引。啊哈! Brian在Adam之后,但在Cindy之前。这是将Brian插入阵列的正确位置。现在你的数组看起来像这样。

Anthony 
Adam 
Brian 
Cindy 
Dirk 

如果你写这样的“插入”方法,你能保证你添加的项目,该阵列始终保持有序。通过使用ArrayList而不是数组,您的生活将变得更容易。在我使用Java的所有时间里,我已经在99.9%的时间内使用ArrayList。

+0

这就是我一直在试图做的!但我必须使用一个数组... – 2013-03-22 02:17:53

+0

你如何编码你在说什么......我已经在这个项目上大约6个小时了,我正在空着 – 2013-03-22 02:30:00

+0

你应该花一些时间写一对夫妇在一张草稿纸上的例子。就像我上面给出的那个。你也应该写一些例子,你有一些名字相似的名字,名字完全相同。您应该有一个示例,其中您的收藏列表为空,然后您应该开始计算将允许您将新联系人插入这些示例的算法,并确保它适用于您刚写入的所有情况下。 – Jazzepi 2013-03-22 03:11:38

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

但这个任务列表或TreeSet中似乎更合适。

+0

我必须这样做Jazzepi说的方式,我只是不知道如何去做编码。 – 2013-03-22 02:26:56

+0

好吧,看优化版本 – 2013-03-22 02:58:37

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; 
+0

编译,但是当我去测试它时,我得到了一堆错误。 – 2013-03-22 03:49:27

+0

显示java.lang.NullPointerException \t在ContactList $ 1.compare(ContactList.java:54) \t在ContactList $ 1.compare(ContactList.java:52) \t在java.util.TimSort.countRunAndMakeAscending(TimSort.java:324 ) \t在java.util.TimSort.sort(TimSort.java:203) \t在java.util.TimSort.sort(TimSort.java:173) \t在java.util.Arrays.sort(Arrays.java: 659) \t at ContactList.add(ContactList.java:52) \t at TestContactList.main(TestContactList.java:17) – 2013-03-22 03:49:56

+0

没有与空姓氏的联系人... – Bohemian 2013-03-22 03:56:04

相关问题