2011-07-06 28 views
0

安排同類型的數據,我在做什麼什麼應該是集收藏

我讀的所有聯繫人在手機上,並將它們存儲在一個集中的邏輯。 Set的語法是Set<String> contactNumbers = new HashSet<String>();。而且我用這個代碼讀取聯繫人

phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
        new String[]{ContactsContract.CommonDataKinds.Phone.NUMBER, ContactsContract.CommonDataKinds.Phone.TYPE}, 
        ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = "+ id, // We need to add more selection for phone type 
        null, 
        null); 
      if(phones != null) { 
       while(phones.moveToNext()){ 
        switch(phones.getInt(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE))){ 
         case Phone.TYPE_MOBILE : 
          contactNumbers.add(phones.getString(0).trim() + "M"); 
          break; 
         case Phone.TYPE_HOME : 
          contactNumbers.add(phones.getString(0).trim() + "H"); 
          break; 
         case Phone.TYPE_WORK : 
          contactNumbers.add(phones.getString(0).trim() + "W"); 
          break; 
         case Phone.TYPE_OTHER : 
          contactNumbers.add(phones.getString(0).trim() + "O"); 
          break; 
        } 
       } 
      } 

問題的定義:

我想用自己的類別來安排數。就像5個數字與家庭類別3個工作號碼和4個來自其他類別一樣,那麼我需要按照「所有特定類型的數字都應該按順序排列」排列所有數字。 例如我的Set包含前5個數字相關的首頁,然後所有3個數字的工作,然後所有4個數字的其他類別。我怎樣才能實現這個邏輯?

回答

0

您的電話號碼可能更好地表示爲一個類(見下文)。

public class PhoneNumber implements Comparable<PhoneNumber> { 

    private final Phone type; 
    private final String number; 

    public PhoneNumber(final Phone type, final String number) { 
     this.type = type; 
     this.number = number; 
    } 

    public Phone getType() { 
     return type; 
    } 

    public String getNumber() { 
     return number; 
    } 

    /** 
    * Sort by type, then number 
    */ 
    @Override 
    public int compareTo(final PhoneNumber other) { 
     int typeComparison = getType().compareTo(other.getType()); 
     return typeComparison == 0 ? getNumber().compareTo(other.getNumber()) : typeComparison; 
    } 

    @Override 
    public String toString() { 
     return getType() + ":" + getNumber(); 
    } 

} 

如果類實現可比,你會得到分揀免費的,如果你使用TreeSet中,如下所示:

final Set<PhoneNumber> contactNumbers = new TreeSet<PhoneNumber>(); 
contactNumbers.add(new PhoneNumber(Phone.TYPE_HOME, "1")); 
contactNumbers.add(new PhoneNumber(Phone.TYPE_MOBILE, "6")); 
contactNumbers.add(new PhoneNumber(Phone.TYPE_OTHER, "3")); 
contactNumbers.add(new PhoneNumber(Phone.TYPE_HOME, "2")); 
contactNumbers.add(new PhoneNumber(Phone.TYPE_WORK, "4")); 
contactNumbers.add(new PhoneNumber(Phone.TYPE_MOBILE, "5")); 

// Prints [TYPE_MOBILE:5, TYPE_MOBILE:6, TYPE_HOME:1, TYPE_HOME:2, TYPE_WORK:4, TYPE_OTHER:3] 
System.out.println(Arrays.toString(contactNumbers.toArray())); 
-2

一個Set不支持順序Collection - 如果你使用List - - 你需要定義一個Comperator你應該使用某種形式的List(如ArrayList,或LinkedList

爲排列本身並使用它來使用Collections.sort(List, Comperator)List進行排序。

+0

LinkedHashSet保持插入順序 – chedine

+0

@chedine - 真實的,但是:1' Set'接口不保證任何順序。 2. OP使用了一個不保持順序的'HashSet'。 'SortedSet'也是一種替代方法,但是'Set'根據定義是不能承諾順序的。 我不明白爲什麼我的回答是反對票。 – RonK

+0

我還沒有投下你的答案.. – chedine

1

使用一個TreeSet,其能夠基於該排序元件(無論是基於自然順序上/使用比較)

Set<String> sortedSet=new TreeSet<String>(); 
    sortedSet.add("a"); 
    sortedSet.add("e"); 
    sortedSet.add("g"); 
    sortedSet.add("b"); 
    sortedSet.add("c"); 
    Iterator<String> it=sortedSet.iterator(); 
    while(it.hasNext()) 
    { 
     String value=it.next(); 
     System.out.println("Value :"+value); 
    } 

下一步,實現自己的比較器,其可在元素進行排序(觸點)的類別,然後將此比較器提供給TreeSet。像這樣的東西。

Set sortedSet=new Treeset(new MyComparator());