[英]Sorting a generic collection
I searched but couldn't find any answer on how to sort my own generic collection class. 我进行了搜索,但找不到有关如何对自己的通用集合类进行排序的任何答案。
I have these four classes: 我有这四个班:
2nd edit Simplified code, applied Evgeniy's suggestion but still doesn't sort, wired :\\ 第2次编辑简化代码,应用了Evgeniy的建议,但仍未排序,有线:\\
A Track class: 跟踪类:
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();
}
}
A TrackContainer class: 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();
}
}
A TrackIDComparator class: 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);
}
}
And finally a Main class: 最后是主类:
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());
}
}
}
Output: 输出:
unsorted: 2 trackname1 - tracktitle1 1 trackname2 - tracktitle2 3 trackname3 - tracktitle3 sorted: 2 trackname1 - tracktitle1 1 trackname2 - tracktitle2 3 trackname3 - tracktitle3
Just add sort() method to TrackContainer 只需将sort()方法添加到TrackContainer
public void sort() {
Collections.sort(arraylist, new TrackIDComparator());
}
UPDATE UPDATE
It's not clear why Track is generic and why T id; 目前尚不清楚为什么Track是通用的,为什么T id是通用的; T interpreter; T口译员; T title; T标题; should have the same type. 应该具有相同的类型。 I suggest to revise the design. 我建议修改设计。 Anyway, 无论如何,
class TrackIDComparator
public int compare(Track<T> o1, Track<T> o2) {
if(o1.getID().hashCode() > o2.getID().hashCode())
return 1;
...
is incorrect, change it as 不正确,将其更改为
public int compare(Track<T> o1, Track<T> o2) {
Comparable id1 = (Comparable)(o1.getId());
Comparable id2 = (Comparable)(o2.getId());
return id1.compareTo(id2);
}
Easy way is to change TrackContainer 简单的方法是更改TrackContainer
public class TrackContainer<T> extends ArrayList<Track<T>>
Remove the arraylist
member variable and use this
in any overriden methods. 删除arraylist
成员变量,并在所有替代方法中使用this
。
TrackContainer<T>
不是List
-如果要在其上使用Collections.sort(List,Comparator)
,则应使其implements List<T>
(当然,并实现所有接口方法)。
TrackContainer
isn't a List
, so you cannot use Collections.sort(List<T>, Comparator<? super T> c)
method. TrackContainer
不是一个List
,所以您不能使用Collections.sort(List<T>, Comparator<? super T> c)
方法。
Alternatively, you want to sort TrackContainer.arrayList
field, so I would suggest to add a sort method that accepts a Comparator<Track<T>>
to do the sorting internally. 另外,您想对TrackContainer.arrayList
字段进行排序,因此我建议添加一个接受Comparator<Track<T>>
的排序方法以在内部进行排序。
Also, you would want to do new TrackIDComparator<String>()
when binding Track
to a type. 此外,将Track
绑定到类型时,您还想执行new TrackIDComparator<String>()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.