Java 比较arraylist中的不同对象值
根据用户偏好,我希望比较数组列表的对象值并获得最大值。我的第一种方法是为object属性定义一个函数,并遍历数组列表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
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行的方法(这很可能相当复杂,或者不会太长)。此外,如果您将来想添加一些逻辑,您可以只添加一个新的比较器,而不是在大型比较器中找到合适的位置来添加代码。