알아보자
1k
2018-12-15 18:50:11
4
401

자바 리스트에서 부분적으로 값이 큰 값 가져오기


리스트에서 값들이 

[a_1, a_2, a_4, b_1, b_2, b_5, c_1, c_4, c_8] 이렇게 있으면

a_4, b_5, c_8 이런 식으로 숫자가 가장 큰 값만 가져오고 다른 값을 지우는 방법이 있나요?


0
0
  • 답변 4

  • azrof95
    22
    2018-12-15 19:41:41


            List<String> list = Arrays.asList("a_1", "a_2", "a_4", "b_1", "b_2", "b_5", "c_1", "c_4", "c_8");
            Map<String, List<Integer>> map = new HashMap<>();
            for (String e : list) {
                String[] parts = e.split("_");
                String code = parts[0];
                if (!map.containsKey(code)) {
                    map.put(code, new LinkedList<>());
                }
                map.get(code).add(Integer.parseInt(parts[1]));
            }
            list = new ArrayList<>(map.size());
            for (Entry<String, List<Integer>> e : map.entrySet()) {
                List<Integer> values = e.getValue();
                values.sort(Integer::compareTo);
                list.add(String.format("%s_%d", e.getKey(), values.get(values.size() - 1)));
            }
            System.out.println(list);


    1
  • 알아보자
    1k
    2018-12-15 19:56:14

    감사합니다


    0
  • azrof95
    22
    2018-12-15 20:01:34
    0
  • daewon
    409
    2018-12-15 23:07:04

    Java 8 이상 사용하시면 아래처럼 선언적으로 코딩도 가능합니다.

    import java.util.*;
    import static java.util.stream.Collectors.*;
    
    class Main {
      static int getValue(String in) {
        return Integer.valueOf(in.split("_")[1]);
      }
    
      static String getKey(String in) {
        return String.valueOf(in.split("_")[0]);
      }
    
      public static void main(String[] args) {
        List<String> ls = Arrays.asList("a_1", "a_2", "a_4", "b_1", "b_2", "b_5", "c_1", "c_4", "c_8");
    
        List<String> maxByValue = ls
          .stream()
          .collect(
              groupingBy(
                Main::getKey,
                maxBy(Comparator.comparing(Main::getValue))
              )
           )
          .values()
          .stream()
          .map(Optional::get)
          .collect(toList());
    
        System.out.println(maxByValue);
      }
    }
    


    javac Main.java && java Main
    // 출력: [a_4, b_5, c_8]
    


    1
  • 로그인을 하시면 답변을 등록할 수 있습니다.