【问题标题】:How do I sort an ArrayList of objects the way that I want如何按照我想要的方式对对象的 ArrayList 进行排序
【发布时间】:2025-11-29 21:50:02
【问题描述】:

我想按照我想要的方式对 ArrayList 对象进行排序。这是我的目标:

    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"}

我想按“West”、“Midwest”、“Southeast”、“Southwest”、“Northeast”对这个对象进行排序

如何排序?

【问题讨论】:

  • 通过覆盖 equals()toString() 方法
  • 你重新排列名字的逻辑是什么?
  • @Satish 这些方法不用于排序。你需要实现一个Comparator&lt;Region&gt;
  • 谷歌搜索“如何在 Java 中对对象进行排序”可能会返回数百个相关结果。阅读并尝试一下。
  • @SatishPatel 你能详细说明你刚才所说的吗

标签: java sorting arraylist


【解决方案1】:

如果您使用自定义对象而不是 String 会容易得多,例如一个名为 Region 的类(属性:名称和排序索引)。然后你可以实现 Comparable 并使用 Collections.sort() 对其进行排序。或者使用像 TreeSet 这样的排序集合类型开始。

【讨论】:

    【解决方案2】:

    因为您想要一个可能不适合此 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);
    }
    

    【讨论】:

    • 谢谢,它对我很有效,但排序相反(“Northeast”,“Southwest”,“Southeast”,“Midwest”“West”),你怎么看?跨度>
    • 如果是反方向,则将(r1, r2)改为(r2, r1)
    • 感谢您的努力!
    【解决方案3】:

    您可以检查 java 的流功能,您可以根据类的任何变量对对象列表进行排序

    【讨论】:

    • 欢迎来到 * 并感谢您的帮助。您可能希望通过添加一些解释来使您的答案变得更好。
    【解决方案4】:

    这是解决问题的非常聪明的方法。 无需编写所有大逻辑。只需创建一个排序区域的数组列表。

    现在关于 arraylist 的伟大之处在于元素是 索引并且所有元素的索引也被排序(0、1、2、3等)。现在只需使用索引本身对区域进行排序。

    希望清楚。

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

    【讨论】:

      最近更新 更多