2013-05-17 68 views
0

我有一個電話簿元素的數組,我試圖根據字典順序使用類似的排序對它們進行排序。但這一切都搞砸了。請幫忙。在此先感謝用於在java中排序對象數組的比較函數?

它也將有助於描述有關在java中的排序功能一點點! 下面是代碼:

package myphonebook; 

import javax.swing.*; 
import java.util.Arrays; 
import java.util.Comparator; 
public class MyPhoneBook implements Comparator<MyPhoneBook>{ 

    private String name,email,number; 
    MyPhoneBook() 
    { 
    } 

    public void input() 
    { 
     name = (JOptionPane.showInputDialog("Enter Name:\n")).toString(); 
     number = JOptionPane.showInputDialog("Enter Number:\n").toString(); 
     email = JOptionPane.showInputDialog("Enter email:\n").toString(); 
    } 
    public void print() 
    { 
     JOptionPane.showMessageDialog(null, "Name: " + name+ "\n" + "Phone: " +number   +"\n"  +  "Email: " + email); 
    } 

    public static void main(String[] args) { 
     MyPhoneBook a[] = new MyPhoneBook[300]; 
     MyPhoneBook b = new MyPhoneBook(); 
     //final Integer[] sorted = ArrayUtils.toObject(MyPhoneBook); 
     int i,n; 
     n = Integer.parseInt(JOptionPane.showInputDi… total number:\n")); 
     for(i=0;i<n;i++) 
     { 
      a[i] = new MyPhoneBook(); 
      a[i].input(); 
     } 
     Arrays.sort(a); 
     for(i=0;i<n;i++) 
     { 
      a[i].print(); 
     } 
    } 

    @Override 
    public int compare(MyPhoneBook o1, MyPhoneBook o2) { 
     return o1.number.compareTo(o2.number); 
    } 

    public int compareTo(MyPhoneBook o) { 
     if(this.name.equals(o.name)) return this.number.compareTo(o.number); 
     if(this.number.equals(o.number)) return this.email.compareTo(o.email); 
     if(this.email.equals(o.email)) return this.name.compareTo(o.name); 
     return 0; 
    } 
} 

回答

1

只要使用String#compareTo,這兩個字符串按字母順序比較。該比較基於字符串中每個字符的Unicode值。

public class MyPhoneBook implements Comparable<MyPhoneBook>{ 
    @Override 
    public int compareTo(MyPhoneBook o) { 
      int returnValue =0; 
      if(o!=null){ 
        returnvalue = this.name.compareTo(o.name); 
        if(returnValue==0){ 
         returnValue = this.number.compareTo(o.number); 
         if(returnValue==0){ 
           returnValue = this.email.compareTo(o.email); 
         } 
        } 

      } 
      return returnValue; 
     } 
} 
+0

我該如何使用? @@ Subhrajyoti – dedicatedtolearn

+0

請檢查更新後的代碼 –

+0

這很簡單直接。任何問題@dedicatedtolearn? –

1

這裏有幾個問題:第一個是你的比較實際上不是字典。例如,名稱相同時,您完全忽略比較邏輯中的電子郵件地址。第二個問題是您無法將比較器指定爲Arrays.sort()的參數。

第一個問題:解決比較邏輯

如果你可以在你的代碼中使用第三方庫,然後一個非常整潔和簡單的方法,這是使用來自GuavaComparisonChain類(谷歌的核心處理這是開源的Java庫):

public int compareTo(MyPhoneBook o) { 
    return ComparisonChain 
     .start() 
     .compare(name, o.name) 
     .compare(email, o.email) 
     .compare(number, o.number) 
     .result(); 
} 

假設你不能做到這一點,但是,這裏是應該做的正確方法:

public int compareTo(MyPhoneBook o) { 
    int nameComparison = name.compareTo(o.name); 
    if (nameComparison != 0) { 
    return nameComparison; 
    } 
    int emailComparison = email.compareTo(o.email); 
    if (emailComparison != 0) { 
    return emailComparison; 
    } 
    return number.compareTo(o.number); 
} 

問題二:調用Arrays.sort()與比較

而非目前的呼叫來Arrays.sort(),用途:

Arrays.sort(a, new PhoneBookComparator()); 

,並定義PhoneBookComparator作爲一個獨立的比較類。

0

運行代碼時,你張貼它涉及到一個

Exception in thread "main" java.lang.ClassCastException: ... 
MyPhoneBook cannot be cast to java.lang.Comparable 

這是因爲你叫

Arrays.sort(a); 

Arrays.html#sort預計包含在數組中的對象要實現接口Comparable。不過,你的班級實際上是Comparator

您應該將類​​聲明改爲以下

public class MyPhoneBook implements Comparable<MyPhoneBook> { 

和一個只是刪除

@Override 
public int compare(MyPhoneBook o1, MyPhoneBook o2) { 
    return o1.number.compareTo(o2.number); 
} 

或者

public class MyPhoneBook { 

和排序,以

Arrays.sort(a, new Comparator<MyPhoneBook>() { 
    @Override 
    public int compare(MyPhoneBook o1, MyPhoneBook o2) { 
     // TODO implment here your comapre logic 
     return o1.number.compareTo(o2.number); 
    } 
}); 
通話

後你有固定的,你會得到NullPointerException異常,againt行

Arrays.sort(a); 

這是因爲你通過長度300的數組,你不必把所有300個元素在裏面,因爲既然你問了total number

你應該使用

Arrays.sort(a, 0, n); 

這只是排序的範圍女巫有數據。請參閱javadoc

+0

非常感謝。代碼工作:) :) – dedicatedtolearn

+0

@dedicatedtolearn不客氣!您可能想要接受答案,以便它不再開放;-) – A4L