Tengo un archivo CSV que contiene aproximadamente 500.000 filas y 22 columnas de datos de vuelo. La quinta columna contiene el número de la cola de cada plano para cada vuelo. La columna 22 contiene la distancia recorrida por cada vuelo. Estoy tratando de resumir la distancia total recorrida (columna 22) para cada número de la cola (columna 5).
Creé una HashMap
que contiene todos los datos con nombre map1
. He creado un segundo HashMap
llamado planeMileages
para colocar cada número de vuelo y la distancia total recorrida en. Estoy usando un anidado si van comunicado a través de cada línea de map1
y ver si el número de cola ya está contenida en el planeMileages
. Si está en planeMileages
, entonces yo quiero añadir a la accumulatedMileages
correspondiente a esa tecla. Si no se contiene, me gustaría introducir la clave junto con su primer valor de distancia.
El código actual que he escrito parece sonido para mí, pero se está produciendo un resultado erróneo, dar salida a la cola número incorrecto. Puede que eche un vistazo y que me haga saber lo que estoy pasando por alto en mi método principal? ¡Gracias!
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;
}
}
Por favor, vea algunas líneas de mi archivo CSV a continuación:
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
Hola se puede comprobar esto?
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;
}));
}
}