我想按照我想要的方式对ArrayList Objects进行排序。这是我的目标:
public class PaintRegion extends JPanel {
public ArrayList<Region> m_region = new ArrayList<Region>();
// some codes
}
及其班级:
public class Region {
private String m_region;
private Integer m_totalCount;
private double m_normalizedCount;
public String getRegion() {
return m_region;
}
public void setRegion(String region) {
this.m_region=region;
}
public Integer getTotalCount() {
return m_totalCount;
}
public void setTotalCount(Integer totalCount) {
this.m_totalCount = totalCount;
}
public double getNormalizedCount() {
return m_normalizedCount;
}
public void setNormalizedCount(double normalizedCount) {
this.m_normalizedCount = normalizedCount;
}
public boolean Print_Region() {
System.out.println("State::Print_Region(): " +
this.getRegion()+ ", "+
this.getTotalCount()+ ", "+
this.getNormalizedCount());
return true;
}
}
我有5个地区名称,分别是{“Southeast”,“Southwest”,“Northeast”,“West”,“Midwest”}
我希望通过“西部”,“中西部”,“东南部”,“西南”,“东北”对这个对象进行排序
我该如何排序?
答案 0 :(得分:2)
如果您使用自定义对象,而不是字符串,那将会更加容易。一个名为Region的类(属性:名称和排序索引)。然后,您可以实现Comparable并使用Collections.sort()对其进行排序。或者使用类似TreeSet的排序集合类型开始。
答案 1 :(得分:1)
因为您想要一个非常具体的排序,可能不适合这个Region类的其他用途,我的建议是使用Comparator
。下面是一个快速草案,了解您的场景可能会是什么样子以及如何使用它。
Comparator<Region> compassComporator = (r1, r2) -> {
//this assumes both objects (and their m_region field) are not null, else do a check for null
if (r1.m_region.equals(r2.m_region)) {
return 0;
}
if ("West".equals(r1.m_region)) {
return 1;
}
if ("West".equals(r2.m_region)) {
return -1;
}
if ("Midwest".equals(r1.m_region)) {
return 1;
}
if ("Midwest".equals(r2.m_region)) {
return -1;
}
if ("Southeast".equals(r1.m_region)) {
return 1;
}
if ("Southeast".equals(r2.m_region)) {
return -1;
}
if ("Southwest".equals(r1.m_region)) {
return 1;
}
if ("Southwest".equals(r2.m_region)) {
return -1;
}
if ("Northeast".equals(r1.m_region)) {
return 1;
}
// if ("Northeast".equals(r2.m_region)) {
return -1;
// }
};
public class PaintRegion extends JPanel {
public ArrayList<Region> m_region = new ArrayList<Region>();
// some codes
m_region.sort(compassComporator);
}
答案 2 :(得分:0)
您可以检查java的流功能,您可以根据类的任何变量对对象列表进行排序
答案 3 :(得分:0)
这是解决问题的非常明智的方法。 无需编写所有大逻辑。只需创建一个排序区域的arraylist。
现在关于arraylist的伟大之处在于元素 索引并且所有元素的索引也被排序(0,1,2,3等)。现在只需使用索引本身对Region进行排序。
希望很清楚。
List<Region> regions = new ArrayList<Region>();
List<String> sortedRegionNames = new ArrayList<>();
sortedRegionNames.addAll(Arrays.asList(new String[]{ "West","Midwest","Southeast","Southwest","Northeast"}));
Comparator<Region> comp = new Comparator<Region>() {
@Override
public int compare(Region r1, Region r2) {
return new Integer(sortedRegionNames.indexOf(r1.getRegion())).compareTo(sortedRegionNames.indexOf(r2.getRegion()));
}
};
Collections.sort(regions, comp );