以一种方式对列表中的某些项目进行排序的最佳方法是什么,其他方式呢?

时间:2017-03-28 18:29:08

标签: java sorting

说我做了一个返回对象列表的搜索

{ age: 5, color: Yellow, eggs: 2 }
{ age: 3, color: White,  eggs: 5 }
{ age: 4, color: Brown,  eggs: 9 }
{ age: 2, color: Green,  eggs: 4 }
{ age: 3, color: Red,    eggs: 1 }
{ age: 1, color: Blue,   eggs: 6 }

我想将它们全部输出,但按特定顺序输出。 如果年龄是3岁,我首先想要这些项目,按大部分鸡蛋排序。 然后我希望其他项目按颜色按字母顺序排序。

所以排序后的列表将是

|   3's: eggs   |    rest: alphabetically on color    |
 White  -  Red  -  Blue  -  Brown  -  Green  -  Yellow

进行此排序的最佳方法是什么,最好不创建临时列表?

可以使用单个比较器完成,也可以使用流?

2 个答案:

答案 0 :(得分:0)

从Java 8开始,Comparator有一些有用的静态方法:

new AgeComparator().thenComparingInt(MyObj::getEggs).thenComparing(new ColorComparator());

不确定你的班级是什么样的 - 这就是你要求的吗?

总的来说,我也喜欢Apache Commons' CompareToBuilder用于组合比较,但在您的情况下似乎太有限了。

答案 1 :(得分:0)

你可以用一个凌乱的比较器来做到这一点。这个想法是:

int compare(myType obj1, myType obj2)
{
    // first compare age
    if (obj1.age == 3)
    {
        if (obj2.age == 3)
        {
            // ages are both 3, so count eggs
            return obj1.eggs.compareTo(obj2.eggs);
        }
        // age 3 sorts before everything else
        return -1;
    }
    else if (obj2.age == 3)
    {
        // if obj2.age is 3, and obj1.age isn't 3,
        // then obj1 is greater than obj2
        return 1;
    }

    // compare color
    return obj1.color.compareTo(obj2.color);
}

请原谅任何语法错误;我的Java有点生疏。