Collection에 저장된 값을 특정 문자를 추가해 합치기

2017-10-19 09:47

오늘 코드 리뷰는 어제 리뷰했던 자바 Collection에서 특정 값이 가장 큰 element를 가져오는 방법에 이어서 진행한다.

어제 요구사항이 자바 Collection에서 특정 값이 가장 큰 element를 가져오는 것이 목표였다면 오늘의 목표는 자바 Collection을 특정 문자를 추가해 합치는 방법이다.

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

위와 같이 Car 클래스가 있고, position 값이 가장 큰 자동차가 3대라면 3대가 공동 우승이 된다.

List<Car> winnerCars = Arrays.asList(new Car("pobi"), new Car("crong"), new Car("honux"));

위와 같이 공동 우승이 3명이면 "pobi, crong, honux 자동차가 공동 우승입니다."와 같은 문자열을 출력하고 싶다. 자바 collection에 저장되어 있는 값을 쉼표 구분자로 어떻게 합치면 좋을까?

어제 코드에서는 for문을 통해 해결하고 있다.

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);
  }
  
  [...]
}

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

0개의 의견 from FB

6개의 의견 from SLiPP

2017-10-19 13:30

collection 을 쉼표 구분자로 합치는건 map 과 reduce 를 사용하여 해결해보았습니다.

List<Car> winnerCars = Arrays.asList(new Car("pobi"), new Car("crong"), new Car("honux"));

String result = winnerCars
        .stream()
        .map(Car::getCarName)
        .reduce((s1, s2) -> s1 + "," + s2)
        .get();

System.out.println(result);
2017-10-19 14:06

"1등 자동차가 3대"를 빼는 로직이 좀 수정되어야 할 듯 하지만, 기존꺼에 연계해서하면 요로코롬... 결론적으로는 .collect(Collectors.joining(",")); 요거.

int maxposition = cars.stream().max(Comparator.comparingInt(Car::getPosition)).get().getPosition();
String topCarNames = cars.stream().filter(o->o.getPosition()==maxposition).map(Car::getCarName).collect(Collectors.joining(","));
2017-10-19 16:40

Collection에 담긴 값을 join하는 상황의 경우 stream을 이용할 수도 있지만 stream을 사용하는 것에 거부감이 있다면 String의 join만 사용해도 좋겠네요.

다음 코드는 A quick and easy way to join array elements with a separator (the opposite of split) in Java 참고.

1) Element를 직접 사용

String joined1 = String.join(",", "a", "b", "c");

2) 배열 사용

String[] array = new String[] { "a", "b", "c" };
String joined2 = String.join(",", array);

3) Iterable 사용

List<String> list = Arrays.asList(array);
String joined3 = String.join(",", list);

String Join과 관련해 Java 8 – StringJoiner example 문서도 참고하면 좋겠네요.

의견 추가하기

연관태그

← 목록으로