2016-11-22 11 views
-3

java7 프로그램을 java8로 변환하려고합니다. 스트림 API를 사용하여 아래 출력을 원합니다.스트림을 사용하여 목록에서 상위 3 카운트 가져 오기

public List<String> getTopThreeWeatherCondition7() { 
    List<String> _Top3WeatherList = new ArrayList<String>(); 
    Map<String, Integer> _WeatherCondMap = getWeatherCondition7(); 
    List<Integer> _WeatherCondList = new ArrayList<Integer>(_WeatherCondMap.values()); 
    Collections.sort(_WeatherCondList, Collections.reverseOrder()); 
    List<Integer> _TopThreeWeathersList = _WeatherCondList.subList(0, 3); 
    Set<String> _WeatherCondSet = _WeatherCondMap.keySet(); 
    Integer count = 0; 
    for (String _WeatherCond : _WeatherCondSet) { 
     count = _WeatherCondMap.get(_WeatherCond); 
     for (Integer _TopThreeWeather : _TopThreeWeathersList) { 
      if (_TopThreeWeather == count) { 
       _Top3WeatherList.add(_WeatherCond); 
      } 
     } 
    } 
    _WeatherCondList = null; 
    _WeatherCondMap = null; 
    _TopThreeWeathersList = null; 
    _WeatherCondSet = null; 
    return _Top3WeatherList; 

} 
+0

때문에 태그에 더 많은 사용자와 통화 할 수 이상의 태그를 설정하십시오. 예를 들어, java, java7, java8을 추가하십시오. – manuzi1

+0

getWeatherCondition7(). valueSet(). stream(). sorted (Collections.reverseOrder()). limit (3) .collect (Collections.toList).()); 이것은 올바른 방향으로 시작해야합니다. – AlexC

+1

나는 이것을 "자바 7 프로그램"이라고 부르지 않을 것이다. 먼저 표준 명명 규칙을 사용하십시오. 즉, 변수 이름을'_' + 대문자 대신 소문자로 시작하십시오. 둘째, 사용 후에 변수를 'null'로 지정하지 마십시오. 셋째,'count = 0'와 같이 변수를 사용하지 않는 기본값으로 초기화하지 마십시오. 이러한 문제를 수정 한 후에이를 "Java 프로그램"이라고 부를 수 있습니다.타입 매개 변수를 반복하는 대신 "다이아몬드 연산자"'<>'를 사용하면 자바 7 프로그램이라고 부를 수 있습니다. – Holger

답변

4

Java 코딩 규칙을 따르는 것이 좋습니다. 변수 이름은 _ + 대문자 대신 소문자로 시작하십시오. 둘째, 사용 후 null에 지역 변수를 할당하지 마십시오. 이것은 쓸모가 없으며 코드의 실제 목적을 혼란스럽게합니다. 또한 변수를 사용하지 않은 기본값 (예 : count = 0)으로 초기화하지 마십시오. 이 경우에는 변수가 실제로 사용되는 내부 루프 내에 선언해야합니다.

또한 값이 아닌 Integer 개의 참조를 비교한다는 점에 유의하십시오. 이 특정 경우에는 객체가 동일한지도에서 비롯된 것처럼 작동 할 수 있지만이를 피해야합니다. 중복 된 값이 있는지 여부는 명확하지 않습니다. 이 경우,이 루프는 올바른 일을하지 않을 것입니다. 또한 entrySet() 키와 값을 함께 반복 할 수 있으므로 keySet()을 반복하지 말고 모든 키에 대해 get 조회를 수행하면 안됩니다.

당신이 말했듯이이 코드는 "Java 7 프로그램"이어야합니다. 제네릭 클래스의 새 인스턴스를 만들 때 형식 인수를 반복 할 필요가없는 "다이아몬드 연산자"(<>)의 존재를 염두에 두어야합니다.

값만 정렬하고 연관된 키를 검색하는 대신 항목을 먼저 정렬해야합니다.

그래서 원래 코드의 깨끗한 자바 7 변형 될 것이다 :이 또한 제대로 중복을 처리

static final Comparator<Map.Entry<String, Integer>> BY_VALUE_REVERSED= 
    new Comparator<Map.Entry<String, Integer>>() { 
     public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) { 
      return Integer.compare(o2.getValue(), o1.getValue()); 
     } 
    }; 
public List<String> getTopThreeWeatherCondition7() { 
    List<String> top3WeatherList = new ArrayList<>(); 
    Map<String, Integer> weatherCondMap = getWeatherCondition7(); 
    List<Map.Entry<String, Integer>> entryList=new ArrayList<>(weatherCondMap.entrySet()); 
    Collections.sort(entryList, BY_VALUE_REVERSED); 
    List<Map.Entry<String, Integer>> topThreeEntries = entryList.subList(0, 3); 
    for(Map.Entry<String, Integer> entry: topThreeEntries) { 
     top3WeatherList.add(entry.getKey()); 
    } 
    return top3WeatherList; 
} 

. 3 위가 동점 일 경우에만 유효한 후보자 중 한 명이 선택됩니다.


만 클린 시작 지점이있는 경우, 당신이 보일 수 있습니다,이 자바 얻을 수있는 이점에 대해 8 개 기능

  • 대신 그것을 정렬 할 List에 컨텐츠를 복사, 당신은을 만들 수 있습니다 바로 Map에서 Stream하고 심지어 훨씬 쉽게 비교기를 만들거나 할 수
  • 새로운 내장 비교기 중 하나 당신이 할 수있는
  • 체인이를 제한하는 태스크를 사용하여 정렬 할 스트림을 말해 키에 세 가지 요소,지도 결과 및 바로 이전 단계의 흐름에 결과 List에 수집 :
public List<String> getTopThreeWeatherCondition7() { 
    Map<String, Integer> weatherCondMap = getWeatherCondition7(); 
    List<String> top3WeatherList = 
     weatherCondMap.entrySet().stream() 
      .sorted(Collections.reverseOrder(Map.Entry.comparingByValue())) 
      .limit(3) 
      .map(Map.Entry::getKey) 
      .collect(Collectors.toList()); 
    return top3WeatherList; 
} 
관련 문제