2013-01-03 3 views
0

사용자 환경 설정에 따라 배열 목록의 객체 값을 비교하고 최대 값을 얻고 싶습니다. 첫 번째 방법은 객체 속성에 대한 함수를 정의하고 배열 목록을 반복하는 것입니다.arraylist에서 다양한 객체 값을 비교

문제가
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 유사한 funktion을 정의 할 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; 
} 

이것은 4 개의 기능 대신 1 비트로 짧아졌지만 나에게도 행복합니다. 그것을 개선하기위한 아이디어가 있습니까?

감사합니다.

답변

0

Comparator를

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 

    } 
을 구현

편집은 다른 답변을보고 :

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

를하고 방법을 변경 : 다음과 같은 모든 다양한 요구를 구현 최대 값을

+0

이제 설정을 고려해야하기 때문에 모든 추악한 코드를'compare()'로 가져와야합니다. 모든 로직을 하나로 묶는 대신 다양한 요구 사항에 대해 서로 다른 'Comparator'클래스를 작성하고 유지 관리하고 디버그하는 것이 훨씬 쉽습니다. – jlordo

+0

그가 설정 개체를 이미 가지고 있는지 여부에 따라 다릅니다. 그 Setting 객체가이 목적을 위해서 만들어진 것이라면, 여러 Comparator를 가지고 있다고 언급 한 것이 더 낫다. – Subin

+0

그가 'Setting' 객체를 이미 가지고 있다고하더라도, 짧은 유지 방법을 생성하기 때문에 내 방식이 더 멋지다. 그는 (의사 코드)'if (Setting == Option1) ... else if (Setting == Option2) ...' – jlordo

2

를 얻을 수 Collections.max(listToBeSorted, new MyComparator(setting))를 사용 ~

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

이 방법으로 클래스가 새로운 속성을 얻는다면 항상 다른 비교자를 추가 할 수 있지만 getMaxValue()을 다시 변경하는 것에 대해 걱정할 필요가 없습니다. 또한 하나 이상의 속성 값을 고려한 복잡한 비교기를 구현할 수 있습니다.