자바 Collection에서 특정 값이 가장 큰 element를 가져오는 방법

2017-10-18 16:02

다음 코드는 List에서 Car의 position이 가장 큰 Car만 추출하는 것이 목적입니다. position 값이 큰 값이 우승한 자동차로 판단해 어떤 자동차가 우승했는지를 출력하기 위함입니다. 우승자는 1명 이상일 수 있습니다.

Car 클래스 코드는 다음과 같습니다.

public class Car {
  private String carName;
  private int position;
  
  public Car(String carName) {
    super();
    this.carName = carName;
  }
  public String getCarName() {
    return carName;
  }
  public int getPosition() {
    return position;
  }
}

위와 같이 name과 position을 필드로 가지고 있는 Car 클래스의 목록에서 position 값이 가장 큰 Car를 추출하는 코드를 다음과 같이 구현했는데요. 아래 코드를 어떻게 하면 가장 간결하게 구현할 수 있을까요?

public class ResultView {
  private Cars cars = null;
	
  private String getTopRankedCar(List<Car> carList) {
    String topCarString = "";
    cars = new Cars(carList);
    int maxPosition = getMaxPosition(carList);
    for(int i=0; i<carList.size(); i++) {
      if(cars.getPosition(i)==maxPosition) topCarString += cars.getCarName(i) + ", ";			
    }
    return topCarString.substring(0, topCarString.length()-2);
  }
  
  private int getMaxPosition(List<Car> carList) {
    int maxPosition = 0;
    cars = new Cars(carList);
    for(int i=0; i<carList.size(); i++) {
      if(maxPosition < cars.getPosition(i)) maxPosition = cars.getPosition(i);
    }
    return maxPosition;
  }
}

구현해야할 기능 목록을 다음과 같겠네요. * List에서 position 값이 가장 큰 Car 목록을 구한다. * 앞에서 구한 Car 목록을 활용해 출력 메시지를 생성한다.

위 샘플 예제는 코드스쿼드 에서 새롭게 진행 중인 마스터즈 코스에서 발췌한 코드입니다. 코드스쿼드의 마스터즈 코스는 코드 리뷰 방식의 개인별 맞춤 학습 방법입니다.

0개의 의견 from FB

8개의 의견 from SLiPP

2017-10-18 16:31

Sort에 대한 각 Comparator는 Car에서 몇개 들고 있어도 될 듯 하지만..여튼 요로코롬 해봤습니다.

List<Car> carList...

int maxposition = carList.stream().sorted((o1, o2) -> Integer.compare(o2.getPosition(), o1.getPosition())).findFirst().get().getPosition();
2017-10-18 16:59

@자바지기 ㅋㅋ 저건 stream에 Optional까지 들어간거라..( 요건상 null이 있을 수도 있다면 Optional까지 본다던지, filter처리를 한다던지 하는게 맞다고 보고. 아니라면 아래의 내용으로 .) 사실 @정휘준님 얘기 처럼 Collections.max() 요런게 편하기는 하죠.

@창천향로님 코드가 더 깔끔하겠네요. 명시적 max라. int maxposition = cars.stream().max((o1, o2) -> Integer.compare(o1.getPosition(), o2.getPosition())).get().getPosition();

그럼 조금 더 줄여서..

int maxposition = cars.stream().max(Comparator.comparingInt(o->o.getPosition())).get().getPosition();

의견 추가하기

연관태그

← 목록으로