0

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

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

问题是,我有 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;
}

这有点短,只有 1 个而不是 4 个函数,但它也不让我高兴。你有什么改进它的想法吗?

谢谢。

4

2 回答 2

2

像这样实现所有不同的需求:

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

并将您的方法更改为

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

这样,如果您的类获得新属性,您始终可以添加不同的比较器,但您永远不必担心getMaxValue()再次更改。您还可以实现复杂的比较器,将多个属性值考虑在内。

于 2013-01-03T11:14:17.917 回答
0

实现一个比较器

 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

     }

编辑查看另一个答案:然后用于Collections.max(listToBeSorted, new MyComparator(setting))获取最大值

于 2013-01-03T11:09:33.697 回答