如何按照我想要的方式对对象的ArrayList进行排序

时间:2017-09-02 16:39:47

标签: java sorting arraylist

我想按照我想要的方式对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”}

我希望通过“西部”,“中西部”,“东南部”,“西南”,“东北”对这个对象进行排序

我该如何排序?

4 个答案:

答案 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 );