2013-04-25 77 views
-2

無法弄清楚如何從擴展分類排序的ArrayList ...無法擴展類和排序的ArrayList

繼承人我有:

AddressBook類:

import java.util.ArrayList; 
import java.util.Iterator; 

public class AddressBook 
{ 
    private ArrayList<Entry> data; 

    public AddressBook() 
    { 
    this.data = new ArrayList(); 
    } 

    public String add(Entry paramEntry) 
    { 
    //Some code  } 

    public ArrayList<Entry> getAddressBook() 
    { 
    return this.data; 
    } 

    public String getAll() 
    { 
    //Some code  
    } 
} 

ExtendedAddressBook類別:

import java.util.*; 
import java.lang.Comparable; 

public class ExtendedAddressBook extends AddressBook 
{ 

    public ExtendedAddressBook() 
    { 

    } 

    public String getAll() 
    { 
     String listAll = "Address Book\n"; 

     ArrayList<Entry> allEntries = getAddressBook(); 

     Collections.sort(allEntries); 

     for (Entry entry : allEntries) 
     { 

       ListAll = ListAll + entry.toString(); 

     } 
     return ListAll; 
    } 

} 

AllEntries類:

import java.lang.Comparable; 

public class AllEntries extends Entry implements Comparable<Entry> 
{ 

    public int compareTo(Entry otherEntry) 
    { 
     int d = this.getFirstName().compareTo(otherEntry.getFirstName()); 
     if (d == 0) 
     { 
      d = this.getLastName().compareTo(otherEntry.getLastName()); 
     } 
     return d; 

    } 
} 

當我嘗試編譯時,我得到'沒有合適的方法發現sort(java.util.ArrayList)在以下行Collection.sort(allEntries);在ExtendedAddressBook類中。有人可以指出我錯誤的地方,如果它甚至可能擴展一個類,以便arrayList可以被排序?由於

+6

如果您將包含[SSCCE](http://www.sscce.org/),並且您的問題更清晰,更有針對性地描述,則此問題將更容易回答 – 2013-04-25 15:15:04

+0

這是功課嗎?如果是這樣,請舉報。看看你正在排序的是什麼類型。 – km1 2013-04-25 15:17:55

+0

@SamIam如果你看到我的原始代碼,你會看到這個程序包含的方法的一半以上被省略。包括所有需要的方法,因爲我犯了一些愚蠢的錯誤,我不能看到 – ToniHopkins 2013-04-25 15:18:25

回答

0

UPDATE:

public class EntryComparator implements Comparator<Entry> 
{  
    public int compare(Entry o1, Entry o2) { 
     //The compare code 

    } 
} 
相反,你應該只是這樣做

並使用以下方法調用ExtendedAddressBook中的方法:

Collections.sort(allEntries, new EntryComparator()); 
1

看來你不需要類AllEntries ..

編輯基於評論: 由於Entry不能修改,改變THA類AllEntries到EntryComparator implements Comparator<Entry>,做一個比較()方法,使用您創建的compareTo()方法作爲基礎

+0

我應該提到我不允許修改代碼中的代碼AddressBook和Entry類。這些是爲我們提供的,我們不能改變它們,只能延伸。 – ToniHopkins 2013-04-25 15:20:44

+2

好的,那麼你需要創建一個比較器,並在Collections.sort方法上使用 – joaonlima 2013-04-25 15:22:31

2

Collections.sort有兩個版本。

first one僅將一個集合作爲參數,並根據其元素自然排序對其元素進行排序。也就是說,元素類型必須實現Comparable,並且該類的compareTo方法用於確定如何排序元素。

second one將集合和Comparator作爲參數,並根據比較器對元素進行排序。這意味着對集合中元素的類型沒有限制。

您可以採用這種方法編寫自己的Comparator<Entry>而不是修改現有的類,然後將其傳遞到Collections.sort中。由於這是一項任務,我會從這裏給你...

7

你有幾個問題。首先,創建一個擴展Entry的AllEntries類,添加Comparable接口,但實際上並沒有創建任何AllEntries對象。但是你不應該那樣做。通過更換AllEntries類得到這個工作 -

Collections.sort(allEntries, new Comparator<Entry>() { 
    public int compare(Entry o1, Entry o2) { 
     return o1.getFirstName().compareTo(o2.getFirstName()); 
    } 
}); 

----完整的例子----

package com.example; 


import java.util.ArrayList; 
import java.util.Comparator; 
import java.util.Collections; 
import java.util.List; 


public class SortExample { 
    private static class Entry { 
     private String firstName; 
     private String lastName; 

     public Entry(String firstName, String lastName) { 
      this.firstName = firstName; 
      this.lastName = lastName; 
     } 

     public String getFirstName() { 
      return firstName; 
     } 

     public String getLastName() { 
      return lastName; 
     } 

     public String toString() { 
      return firstName + " " + lastName; 
     } 
    } 

    public static void main(String[] args) { 
     List<Entry> list = new ArrayList<Entry>(); 
     list.add(new Entry("Homer", "Simpson")); 
     list.add(new Entry("George", "Jettson")); 
     list.add(new Entry("Fred", "Flinstone") ); 
     list.add(new Entry("Fred", "Durst")); 

     Collections.sort(list, new Comparator<Entry>() { 
      public int compare(Entry o1, Entry o2) { 
       int compareValue = o1.getFirstName().compareTo(o2.getFirstName()); 
       if (compareValue == 0) { 
        compareValue = o1.getLastName().compareTo(o2.getLastName()); 
       } 
       return compareValue; 
      } 
     }); 

     for (Entry entry : list) { 
      System.out.println(entry); 
     } 
    } 
} 
+0

因此,我可以擦洗AllEntries類,並將上面的代碼放在ExtendedAddressBook類中?如果這是正確的我試過了,但得到另一個錯誤,指出java.util.Comparator是抽象的;不能實例化。嘗試玩代碼,但無濟於事... – ToniHopkins 2013-04-26 10:48:03

+1

@ToniHopkins,是的,擦洗AllEntries類。我向你保證它確實有效,請參閱上面的完整示例(已編譯和測試_)。 – Lucas 2013-04-26 14:05:42