根据用户首选项,我想比较数组列表的对象值并获取最大值。我的第一种方法是为对象属性定义一个函数并迭代数组列表。
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个类似的funktion似乎不是正确的,所以我尝试它结合所有功能,并添加了一个开关/案例
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个功能,但它也不会让我开心。你有什么想法来改进吗?
感谢。
答案 0 :(得分: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()
。您还可以实现复杂的比较器,将多个属性值考虑在内。
答案 1 :(得分: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))
获取最大值