【问题标题】:Sorting a list of objects based on different data members in java在java中根据不同的数据成员对对象列表进行排序
【发布时间】:2012-05-18 16:05:57
【问题描述】:
我有这门课:
public class Friend {
private String name;
private String location;
private String temp;
private String humidity;
public String getTemp() {
return temp;
}
public void setTemp(String temp) {
this.temp = temp;
}
public String getHumidity() {
return humidity;
}
public void setHumidity(String humidity) {
this.humidity = humidity;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
}
}
我想根据用户输入的名称、位置、温度和湿度对列表进行排序。
编辑:用户指定必须由哪个数据成员进行排序。
最简单的方法是什么?
谢谢。
【问题讨论】:
标签:
java
string
sorting
collections
comparable
【解决方案1】:
因为您想按四种不同的标准对它们进行排序,所以实现 Comparable 没有意义。在这种情况下,您可能会发现为每个排序依据参数创建不同的比较器。但是,您可以为最符合逻辑的排序字段(例如名称)实现 Comparable。否则,比较器就是要走的路。
public class FriendNameComparator extends Comparator<Friend> {
// assuming both are non-null for code simplicity; you may wish to change that
public int compare(Friend f1, Friend f2) {
return f1.getName().compareTo(f2.getName());
}
}
public class FriendLocationComparator extends Comparator<Friend> {
// assuming both are non-null for code simplicity; you may wish to change that
public int compare(Friend f1, Friend f2) {
return f1.getLocation().compareTo(f2.getLocation());
}
}
// and so forth
然后,您可以使用 Collections 实用程序类的 sort 函数按给定的比较器进行排序。
Collections.sort(friendsList, new FriendNameComparator()); // sorts by name
Collections.sort(friendsList, new FriendLocationComparator()); // sorts by location
// etc
【解决方案2】:
Java 有一个名为 Collections.sort(List, Comparator) 的静态函数,它对给定自定义 Comparator 的(生成的)对象列表进行排序,给定两个相同类型的对象,确定哪个在另一个之前排序。
你的任务是编写一个函数来创建一个Comparator,它根据其参数和用户指定的排序顺序对对象进行排序。例如:
public Comparator<Friend> getComparator(final String sortBy) {
if ("name".equals(sortBy)) {
return new Comparator<Friend>() {
@Override int compare(Friend f1, Friend f2)
return f1.getName().compareTo(f2.getName());
}
};
} else if ("location".equals(sortBy)) {
return new Comparator<Friend>() {
@Override int compare(Friend f1, Friend f2)
return f1.getLocation().compareTo(f2.getLocation());
}
};
} else if ("temp".equals(sortBy)) {
// ...
} else {
throw new IllegalArgumentException("invalid sort field '" + sortBy + "'");
}
}
【解决方案3】:
List list=new ArrayList();
对每个条件使用 If else if:
if(location ){
Collections.sort(list, new Comparator () {
public int compare(YourObject o1, YourObject o2) {
return o1.getLocation().compareTo(o2.getLocation());
}
});
}
} else if(temp ){
........
}
.......