2

検索しましたが、自分のジェネリックコレクションクラスを並べ替える方法についての答えが見つかりませんでした。

私はこれらの4つのクラスを持っています:

2番目の編集 簡略化されたコード、Evgeniyの提案を適用しましたが、それでもソートされません、有線:\

トラッククラス:

public class Track {
    private Integer id;
    private String interpreter;
    private String title;
    Track(int id,String interpreter,String title) {
        this.id=id;
        this.interpreter=interpreter;
        this.title=title;
    }
    public String getInterpreter() {
        return this.interpreter;
    }
    public String getTitle() {
        return this.title;
    }
    public int getID() {
        return this.id;
    }
    public String getCompleteName() {
        return this.id+"\t"+this.interpreter.toString()+" - "+this.title.toString();
    }
}

TrackContainerクラス:

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

public class TrackContainer<T> extends ArrayList<T> {
    private static final long serialVersionUID = 1L;
    ArrayList<T> arraylist;

    TrackContainer() {
        arraylist = new ArrayList<T>();
    }

    public boolean insertTrack(T track) {
        if(arraylist.add(track)) 
            return true;
        return false;
    }
    public void listAllTracks(java.util.Iterator<T> iterat) {
        while(iterat.hasNext()) {
            System.out.println(iterat.next());
        }
    }

    public Iterator<T> iterator() {
        // TODO Auto-generated method stub
        return arraylist.iterator();
    }
}

TrackIDComparatorクラス:

import java.util.Comparator;
public class TrackIDComparator implements Comparator<Track> {
    @Override
    public int compare(Track t1, Track t2) {
        // TODO Auto-generated method stub
        Comparable id1 = (Comparable)(t1.getID());
        Comparable id2 = (Comparable)(t2.getID());
        return id1.compareTo(id2);
    }
}

そして最後にメインクラス:

import java.util.Collections;
import java.util.Iterator;
public class Main {
    public static void main(String[] args) {
        TrackContainer<Track> ltc = new TrackContainer<Track>();
        ltc.insertTrack(new Track(2,"trackname1","tracktitle1"));
        ltc.insertTrack(new Track(1,"trackname2","tracktitle2"));
        ltc.insertTrack(new Track(3,"trackname3","tracktitle3"));

        System.out.println("unsorted:");
        Iterator<Track> it = ltc.iterator();
        while(it.hasNext()) {
            System.out.println(it.next().getCompleteName());
        }

        System.out.println("sorted:");
        Collections.sort(ltc,new TrackIDComparator());
        Iterator<Track> it2 = ltc.iterator();
        while(it2.hasNext()) {
            System.out.println(it2.next().getCompleteName());
        }
    }
}

出力:

未分類:
2 trackname1-tracktitle1
1 trackname2-tracktitle2
3 trackname3-tracktitle3
ソート済み:
2 trackname1-tracktitle1
1 trackname2-tracktitle2
3 trackname3-tracktitle3
4

4 に答える 4

3

TrackContainerにsort()メソッドを追加するだけです

public void sort()  {
    Collections.sort(arraylist, new TrackIDComparator()); 
}

アップデート

Trackが一般的である理由とTidがなぜであるかは明らかではありません。T通訳; Tタイトル; 同じタイプである必要があります。デザインを修正することをお勧めします。ともかく、

class TrackIDComparator 

     public int compare(Track<T> o1, Track<T> o2) {
           if(o1.getID().hashCode() > o2.getID().hashCode())
               return 1;
...

正しくない場合は、次のように変更してください

public int compare(Track<T> o1, Track<T> o2) {
      Comparable id1 = (Comparable)(o1.getId());
      Comparable id2 = (Comparable)(o2.getId());
      return id1.compareTo(id2);
}
于 2012-12-06T12:29:34.273 に答える
2

簡単な方法はTrackContainerを変更することです

public class TrackContainer<T> extends ArrayList<Track<T>>

arraylistメンバー変数を削除thisし、オーバーライドされたメソッドで使用します。

于 2012-12-06T12:30:44.747 に答える
1

TrackContainer<T>ではありませんList-使用する場合Collections.sort(List,Comparator)は、作成する必要がありますimplements List<T>(もちろん、すべてのインターフェイスメソッドを実装します)。

于 2012-12-06T12:22:28.763 に答える
0

TrackContainerではないためList、メソッドを使用することはできませんCollections.sort(List<T>, Comparator<? super T> c)

または、フィールドを並べ替えたいTrackContainer.arrayListので、を受け入れる並べ替えメソッドを追加してComparator<Track<T>>、内部で並べ替えを行うことをお勧めします。

new TrackIDComparator<String>()また、型にバインドするときに実行する必要がありますTrack

于 2012-12-06T12:24:07.687 に答える