2013-03-22 65 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

相關問題