2016-11-22 29 views
-3

我想将java7程序转换为java 8.我想要下面的输出使用流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

我不会称之为“Java 7程序”。首先,使用标准的命名约定,即用小写字母代替'_' +大写字母开始变量名称。其次,使用后不要将变量分配给'null'。第三,不要使用未使用的默认值来初始化变量(如'count = 0')。解决这些问题后,我们可以将其称为“Java程序”。开始使用“菱形运算符”'<>'而不是重复类型参数,我们可以将其称为“Java 7程序”。 – Holger

回答

4

我强烈建议遵守Java编码约定。用小写字母代替_ +大写字母开始变量名称。其次,使用后不要将局部变量分配给null。这已经过时了,并且偏离了代码的实际目的。此外,不要使用未使用的默认值初始化变量(如count = 0)。在这个特定的情况下,你也应该在内部循环中声明它实际使用的变量。

还请注意,您正在比较Integer引用而不是值。在这种特定情况下,它可能会起作用,因为对象来自同一张地图,但您应该避免这种情况。目前尚不清楚是否可能存在重复价值;在这种情况下,这个循环不会做正确的事情。此外,您不应该遍历keySet(),只是为了对每个键执行get查找,因为entrySet()允许将键和值一起迭代。

既然你说,这个码应该是一个“Java 7的节目”你应该想到“钻石经营者”的存在(<>)它不需要创建通用类的新实例时,重复类型参数。

不是仅对值进行排序并搜索关联的键,您应该首先对条目进行排序。

所以你的原代码干净的Java 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; 
} 

这也正确处理重复。只有在第三名的情况下,才会选择一名有效的候选人。


只有当你有一个干净的起点,你可以看看,这可怎么从Java中获益8个功能

  • 而不是复制内容到List对它进行排序,你可以创建一个从一MapStream并告诉流排序
  • 您可以创建一个比较要容易得多,甚至可以使用
  • 你可以连续使用新的内置比较器的一个限制的任务导致三个元素,映射到按键和收集到的结果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; 
} 
相关问题