Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何按所需方式对对象的ArrayList排序_Java_Sorting_Arraylist - Fatal编程技术网

Java 如何按所需方式对对象的ArrayList排序

Java 如何按所需方式对对象的ArrayList排序,java,sorting,arraylist,Java,Sorting,Arraylist,我想按我想要的方式对ArrayList对象进行排序。这是我的目标: public class PaintRegion extends JPanel { public ArrayList<Region> m_region = new ArrayList<Region>(); // some codes } 我有5个地区名称,分别是{“东南”、“西南”、“东北”、“西部”、“中西部”} 我想按“西部”、“中西部”、“东

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

    public class PaintRegion extends JPanel {       
        public ArrayList<Region> m_region = new ArrayList<Region>(); 
        // some codes
}
我有5个地区名称,分别是{“东南”、“西南”、“东北”、“西部”、“中西部”}

我想按“西部”、“中西部”、“东南部”、“西南部”、“东北部”对这架飞机进行排序


如何排序?

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

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

,因为您需要非常特定的排序,可能不适合此区域类的其他用途,我的建议是使用
比较器
。下面是一个关于你的场景可能看起来像什么以及如何使用它的快速草稿

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);
}
比较器compasscomposator=(r1,r2)->{ //这假设两个对象(及其m_区域字段)都不是null,否则检查null if(r1.m_区域等于(r2.m_区域)){ 返回0; } 如果(“西”。等于(r1.m_区域)){ 返回1; } 如果(“西”。等于(r2.m_区域)){ 返回-1; } 如果(“中西部”。等于(r1.m_地区)){ 返回1; } 如果(“中西部”。等于(r2.m_地区)){ 返回-1; } if(“东南”。等于(r1.m_区域)){ 返回1; } 如果(“东南”。等于(r2.m_区域)){ 返回-1; } 如果(“西南”。等于(r1.m_地区)){ 返回1; } 如果(“西南”。等于(r2.m_地区)){ 返回-1; } if(“东北”。等于(r1.m_区域)){ 返回1; } //如果(“东北”。等于(r2.m_区域)){ 返回-1; // } }; 公共类PaintRegion扩展了JPanel{ public ArrayList mu region=new ArrayList(); //一些代码 m_region.sort(Compasscomposator); }
这是一种非常智能的解决问题的方法。 不需要写所有的大逻辑。只需创建一个排序区域的arraylist

现在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 );
List regions=new ArrayList();
List sortedRegionNames=new ArrayList();
addAll(Arrays.asList(新字符串[]{“West”、“Midwest”、“southern”、“southern”、“southern”、“Northeast”);
比较器comp=新比较器(){
@凌驾
公共整数比较(区域r1、区域r2){
返回新整数(sortedRegionNames.indexOf(r1.getRegion()).compareTo(sortedRegionNames.indexOf(r2.getRegion());
}
};
集合。排序(区域、公司);

通过重写
equals()
toString()
方法重新排序名称的逻辑是什么?@Satish排序时不使用这些方法。您需要实现一个
比较器
。通过谷歌搜索“如何在Java中对对象进行排序”可能会返回数百个相关结果。读一读,然后试试。@SatishPatel你能详细说明你刚才说的吗?汉克斯,它对我很有用,但它是反向排列的(“东北”、“西南”、“东南”、“中西部”、“西部”),你觉得怎么样?如果是反向排列,那么把
(r1,r2)
改为
(r2,r1)
谢谢你的努力!欢迎来到StackOverflow,感谢您的帮助。您可能希望通过添加一些解释来更好地回答问题。
 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 );