0

Name と Year の 2 つのフィールドを持つ arraylist があります。この配列を条件入力名でソートしたい(名前入力順)。名前が同じ場合は年順になります。

Example
Name     Year
Ann      2000
Bech     2001
Bach     2013
Bach     2012
Chu      1999

入力が Bach でソートされる関数を作成するとします。結果が表示されます

Name     Year
Bach     2013
Bach     2012
Ann      2000
Bech     2001
Chu      1999

入力がバッハで一番最初が「バッハ」で全ての名前を表示したいので同じ名前の場合は年順(大きいものから小さいもの)でソートします。「バッハ」名が同じでない場合は、compareTo() を使用して AZ で並べ替えます。これは私のコードですが、入力条件名がありません。新しい関数を作って同じように助けてください sort_inputname(String inputname)

    //Class compare Name- Year
public class Search_Name_Year_Comparator implements Comparator<SearchListInformation>
{


            public int compare(SearchListInformation left,
                    SearchListInformation right) {
                // TODO Auto-generated method stub
                 int dateComparison;
                    int dataComparison = 0;
        if(left.getName().compareTo(right.getName())==0)
            {
             if(left.getYear().compareTo(right.getYear())>0)
             {
             return -1;
             }
             else if(left.getYear().compareTo(right.getYear())<0)
             {
                 return  1;
             }
             else 
                 return 0;


             }
        else
         return  left.getName().compareTo(right.getName());
4

1 に答える 1

0

あなたの質問を理解するのは少し難しいです (あなたは英語のネイティブ スピーカーではないと思いますが、それを責めることはできません)。私が理解していることから、Name と Year の 2 つのプロパティを持つオブジェクトの ArrayList を並べ替えたいと考えています。これらのオブジェクトが「SearchListInformation」と呼ばれていると仮定して、SearchListInformation の ArrayList をソートしようとしています。

ここで行うことは、SearchListInformation クラスにComparable (Comparator ではない) インターフェイスを実装させることです (詳細については、リンクを参照してください)。次に、 Collections.sort を使用して ArrayList を並べ替えることができます。たとえば、次のようになります。

    ArrayList<SearchListInformation> list = new ArrayList<SearchListInformation>();
    list.add(new Person("Bob", 2000));
    list.add(new Person("Lucy", 2010));
    Collections.sort(list);

Comparator インターフェイスを使用する場合は、Collections.sort(List, Comparator) も使用できます。次に、投稿したコードを使用できますが、次のように簡略化します。

    @Override
    public int compare(SearchListInformation left, SearchListInformation right) {
        if(left.getName().compareTo(right.getName())==0)
             return -1*left.getYear().compareTo(right.getYear())
        else
            return  left.getName().compareTo(right.getName());
    }

編集:常にリストの先頭にある名前を指定できるようにしたい場合は、2番目のオプションを使用する必要があります:次のように Comparator インターフェイスを実装します:

    public MyComparator implements Comparator<SearchListInformation> {

        protected String _priorityName;

        public MyComparator(String priorityName) {
            _priorityName = priorityName;
        }

        @Override
        public int compare(SearchListInformation left, SearchListInformation right) {
            if(left.getName().compareTo(right.getName())==0)
                 return -1*left.getYear().compareTo(right.getYear())
            else if(left.getName().equals(_priorityName)
                return -1;
            else if(right.getName().equals(_priorityName)
                return 1;
            else
                return  left.getName().compareTo(right.getName());
        }

    }

次に、次を使用できます。

    Collections.sort(list, new MyComparator("Bach"));
于 2012-12-29T18:49:13.667 に答える