Java 比较arraylist中的不同对象值

Java 比较arraylist中的不同对象值,java,object,loops,compare,Java,Object,Loops,Compare,根据用户偏好,我希望比较数组列表的对象值并获得最大值。我的第一种方法是为object属性定义一个函数,并遍历数组列表 private MyModel getMaxValueA(ArrayList<MyModel> myModelList) { MyModel res = null; for (MyModel myModel : myModelList) { if (myModel != null) { if (myMod

根据用户偏好,我希望比较数组列表的对象值并获得最大值。我的第一种方法是为object属性定义一个函数,并遍历数组列表

    private MyModel getMaxValueA(ArrayList<MyModel> myModelList) {
    MyModel res = null;
    for (MyModel myModel : myModelList) {
        if (myModel != null) {
            if (myModel.valueA() > res.valueA()) {
                res = myModel;
            }
        } else {
            res = myModel;
        }
    }
    return res;
}
私有MyModel getMaxValueA(ArrayList myModelList){
MyModel res=null;
对于(MyModel MyModel:myModelList){
if(myModel!=null){
if(myModel.valueA()>res.valueA()){
res=myModel;
}
}否则{
res=myModel;
}
}
返回res;
}
问题是,我有4个不同的值要比较,而定义4个类似的函数似乎并不正确,所以我尝试将所有函数组合起来,并添加了一个开关/案例

    private MyModel getMaxValueA(ArrayList<MyModel> myModelList, Setting mySetting) {
    MyModel res = null;
    for (MyModel myModel : myModelList) {
        if (myModel != null) {
            switch (mySetting) {
            case settingA:
                if (myModel.valueA() > res.valueA()) {
                     res = myModel;
                    }
                break;
            case settingB:
                if (myModel.valueB() > res.valueB()) {
                     res = myModel;
                    }

                break;
            ........
        } else {
            res = myModel;
        }
    }
    return res;
}
private MyModel getMaxValueA(ArrayList myModelList,设置mySetting){
MyModel res=null;
对于(MyModel MyModel:myModelList){
if(myModel!=null){
开关(mySetting){
案例设置A:
if(myModel.valueA()>res.valueA()){
res=myModel;
}
打破
案例设置B:
if(myModel.valueB()>res.valueB()){
res=myModel;
}
打破
........
}否则{
res=myModel;
}
}
返回res;
}
这有点短,只有1个函数而不是4个函数,但它也不能让我高兴。你有什么改进的想法吗

谢谢。

实现一个比较器

 class MyComparator extends Comparator<MyModel> {
     Setting s;
     MyComparator(Setting s ){
        this.setting=s;
     } 
     public int compare(MyModel model, MyModel model2) {
        //do the comparison utilizing setting

     }
类MyComparator扩展了比较器{
设置s;
MyComparator(设置s){
该设置=s;
} 
公共整数比较(MyModel模型,MyModel2){
//使用设置进行比较
}

编辑查看另一个答案:然后使用
Collections.max(listToBeSorted,新的MyComparator(设置))
获得最大值

实现您的所有不同需求,如下所示:

class SettingsAComparator extends Comparator<MyModel> {
    @Override
    public int compare(MyModel m1, MyModel m2) {
         return m1.valueA() - m2.valueA();
    }
}

class SettingsBComparator extends Comparator<MyModel> {
    // Please use better names.
    // you can implement as many Comparators as necessary.
}
类设置Comparator扩展Comparator{
@凌驾
公共整数比较(MyModel m1、MyModel m2){
返回m1.valueA()-m2.valueA();
}
}
类设置比较器扩展比较器{
//请用更好的名字。
//您可以根据需要实现任意多个比较器。
}
并将您的方法更改为

private MyModel getMaxValue(ArrayList<MyModel> myModelList, Comparator<MyModel> comparator) {
    return Collections.max(myModelList, comparator);
}
私有MyModel getMaxValue(ArrayList myModelList,Comparator Comparator){
return Collections.max(myModelList,comparator);
}

这样,如果你的类获得了一个新的属性,你总是可以添加不同的比较器,但是你不必担心再次更改
getMaxValue()
。你也可以实现复杂的比较器,它考虑了多个属性值。

现在你把所有难看的代码都放到
compare()中了
因为必须考虑设置。根据不同的需要使用不同的
比较器
类,而不是将所有逻辑打包到一个类中,这样更容易编写、维护和调试。这取决于他是否已经有一个设置对象。如果该设置对象正是为此目的创建的,那么您的想法是什么拥有多个比较器更好。即使他已经有了一个
Settings
对象,我的方式也更好,因为它生成了简短的可维护方法。他可以根据
设置选择比较器,而不是拥有一个包含类似(伪代码)
if(Setting==Option1)…else if之类代码的巨型比较器(Setting==Option2).
同意我的方法生成更大更复杂的比较()方法。另一方面,在你的方法中,我们必须编写大量的类,每个类都有较小的方法。我没有足够的经验来理解哪个更好。更好总是主观的。但如果我在调试时寻找错误,我宁愿阅读10个方法,每个方法有30行(更容易阅读),而不是一个有300行的方法(这很可能相当复杂,或者不会太长)。此外,如果您将来想添加一些逻辑,您可以只添加一个新的比较器,而不是在大型比较器中找到合适的位置来添加代码。