0

電話帳要素の配列があり、同等の並べ替えを使用して辞書順に従って並べ替えようとしています。しかし、それはすべて台無しです。助けてください。前もって感謝します

また、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;
    }
}
4

3 に答える 3

1

ここにはいくつかの問題があります。1 つ目は、比較が実際には辞書式ではないということです。たとえば、名前が等しい場合、比較ロジックで電子メール アドレスを完全に無視します。2 つ目の問題は、コンパレーターを Arrays.sort() のパラメーターとして指定していないことです。

最初の問題: 比較ロジックを修正する

コードでサードパーティのライブラリを使用できる場合、これを処理するための本当にきちんとした簡単な方法は、 Guavaライブラリ (オープンソースである Google のコア Java ライブラリ)のComparisonChainクラスを使用することです。

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

2 番目の問題: コンパレータを使用して Arrays.sort() を呼び出す

Arrays.sort() への現在の呼び出しの代わりに、次を使用します。

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

そして、PhoneBookComparator を別の Comparator クラスとして定義します。

于 2013-05-17T06:46:43.570 に答える
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 が発生することを修正した後、行のために再び

Arrays.sort(a);

これは、長さの配列を渡すためであり、300300 個すべての要素をその配列に入れる必要があるとは限らないためです。total number

あなたが使用する必要があります

Arrays.sort(a, 0, n);

これは、データを持つ範囲ウィッチのみをソートします。javadocを参照してください。

于 2013-05-17T06:55:06.703 に答える