开发者社区> 问答> 正文

Java:如何使用HashMaps根据第二列中的条件求和一列的所有值

我有一个CSV文件,其中包含大约500,000行和22列的航班数据。第5列包含每次飞行的每个飞机的机尾号。第22列包含每次飞行的行进距离。我试图将每个尾号(第5列)的总行驶距离(第22列)相加。

我创建了一个HashMap包含所有名为的数据map1。我创建了一个第二个HashMap名称,planeMileages以放置每个航班号及其​​所经过的总距离。我正在使用嵌套的if语句遍历每行,map1并查看是否已包含尾号planeMileages。如果位于中planeMileages,那么我想添加到该accumulatedMileages键。如果不包含它,我想输入密钥以及它的第一个距离值。

我写的当前代码对我来说听起来不错,但是它产生了错误的结果,输出了不正确的尾号。您能否看一下并让我知道主要方法中忽略的内容?谢谢!

public class FlightData {

    HashMap<String,String[]>  dataMap;

        public static void main(String[] args) {

            FlightData map1 = new FlightData();
            map1.dataMap = map1.createHashMap();

            HashMap<String, Integer> planeMileages = new HashMap();
            //Filling the Array with all tail numbers
            for (String[] value : map1.dataMap.values()) {

                if(planeMileages.containsKey(value[4])) {  
                    int accumulatedMileage = planeMileages.get(value[4]) + Integer.parseInt(value[21]);
                    planeMileages.remove(value[4]);
                    planeMileages.put(value[4], accumulatedMileage);
                } 
                else {
                    planeMileages.put(value[4],Integer.parseInt(value[21]));
                }
            }


            String maxKey = Collections.max(planeMileages.entrySet(), Map.Entry.comparingByValue()).getKey();

            System.out.println(maxKey);


        }





       public HashMap<String,String[]> createHashMap() {
            File flightFile = new File("flights.csv");
            HashMap<String,String[]> flightsMap = new HashMap<String,String[]>();

            try {
            Scanner s = new Scanner(flightFile);
            while (s.hasNextLine()) {

                    String info = s.nextLine();
                    String [] piecesOfInfo = info.split(",");

                        String flightKey = piecesOfInfo[4] + "_" + piecesOfInfo[2] + "_" + piecesOfInfo[11]; //Setting the Key
                        String[] values = Arrays.copyOfRange(piecesOfInfo, 0, piecesOfInfo.length);

                        flightsMap.put(flightKey, values);


            }
            s.close();
            }


           catch (FileNotFoundException e)
           {
             System.out.println("Cannot open: " + flightFile);
           }

            return flightsMap;
        }
}

请在下面查看我的CSV文件的几行:

DayofMonth  DayOfWeek   FlightDate  UniqueCarrier   TailNum OriginAirportID Origin  OriginStateName DestAirportID   Dest    DestStateName   DepTime DepDelay    WheelsOff   WheelsOn    ArrTime ArrDelay    Cancelled   CancellationCode    Diverted    AirTime Distance
3   1   10/3/2016   AA  N786AA  10721   BOS Massachusetts   12478   JFK New York    556 -4  623 703 709 -6  0       0   40  187
4   2   10/4/2016   AA  N794AA  10721   BOS Massachusetts   12478   JFK New York    554 -6  615 703 712 -3  0       0   48  187
1   6   10/1/2016   AA  N783AA  12478   JFK New York    12892   LAX California  823 -7  844 1104    1111    -30 0       0   320 2475
2   7   10/2/2016   AA  N798AA  12478   JFK New York    12892   LAX California  847 17  904 1131    1159    18  0       0   327 2475
3   1   10/3/2016   AA  N786AA  12478   JFK New York    12892   LAX California  825 -5  838 1109    1131    -10 0       0   331 2475
4   2   10/4/2016   AA  N794AA  12478   JFK New York    12892   LAX California  826 -4  848 1114    1132    -9  0       0   326 2475

问题来源:Stack Overflow

展开
收起
montos 2020-03-23 21:19:03 583 0
1 条回答
写回答
取消 提交回答
  • 您好,您可以检查一下吗?

    public static void main(String[] args) throws  IOException {
    
        Map<String, String[]> map = createMap();
        Map<String, Long> planeMileages = map
                .entrySet()
                .stream()
                .collect(Collectors.groupingBy(o -> o.getValue()[4],
                        Collectors.collectingAndThen(
                                Collectors.summarizingInt(value ->
                                        Integer.parseInt(value.getValue()[21])), IntSummaryStatistics::getSum
                        )
                ));
        String maxKey = planeMileages.entrySet().stream().max(Comparator.comparing(Map.Entry::getValue)).get().getKey();
        System.out.println("max key: "+ maxKey);
    }
    
    public static Map<String, String[]> createMap() throws IOException {
        try (BufferedReader a = Files.newBufferedReader(Paths.get("flights.csv"))) {
            return a.lines().map(s -> s.split(","))
                    .collect(Collectors.toMap(piecesOfInfo -> String.join("_", piecesOfInfo[4], piecesOfInfo[2], piecesOfInfo[11]), Function.identity()));
        }
    }
    
    public static Map<String, String[]> createMapLastDupWins() throws IOException {
        try (BufferedReader a = Files.newBufferedReader(Paths.get("flights.csv"))) {
            return a.lines().map(s -> s.split(","))
                    .collect(Collectors.toMap(piecesOfInfo -> String.join("_", piecesOfInfo[4], piecesOfInfo[2], piecesOfInfo[11]), Function.identity(), (strings, strings2) -> {
                        //if this helps than data is duplicated
                        return strings2;
                    }));
        }
    }
    

    回答来源:Stack Overflow

    2020-03-23 21:19:46
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载