Collections groupingBy mit Bedingung

Guten Tag,

Ich habe ein 2d Array show[][], dass aus dem Apache Server Log generiert wurde.
Das Feld show[][0] enthält ip-adressen die eine Anfrage an das Server geschieckt haben.
Das Feld show[][2] enthält Status-index zmb. 403 für unberechtigte Anfrage usw.
Ich muss die ip-adressen mit dem Status 4** aussortieren und die Anzahl von solchen Anfragen zusammenzählen.
Danach muss ich die sortierte Daten am besten in ein neues Array speichern für die Visualisation.
Mein Versuch:
Java:
String [][]show=scanFile("/home/user/Schreibtisch/loagApache.txt");
String[]ipAr=new String[show.length];//neues Array für ip-adressen umd daraus eine Liste zu basteln..
          //  evtl. könnte man das Feld show[][0] direkt zu einer  Liste wandeln ,
        //leider bin noch nicht dazu gekommen.
for(int i=0;i<show.length;i++) {
            ipAr[i]=show[i][0];                 //Übertragen alle ip`s in das neue Array
        }

List<String>ip=Arrays.asList(ipAr);


 /**** Beim result Aufbau  brauche ich nur die ip`s die 4** Statuscode haben,jetzt habe ich alle ***/
Map<String,Long> result=ip.stream().
                collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
//Hier werden alle Anfragen gezählt und zusammen mit  ip`s zu einer Map hinzugefügt.
                           
for(String key : result.keySet())
            {
             
              System.out.print("Key: " + key + " - ");
              System.out.print("Value: " + result.get(key) + "\n"); //Ausgabe von der Map.
            }
Ausgabe -> Key: 195.140.123.181 - Value: 69
....usw.

Danke für jede Hilfe.
 
Zum Beispiel so:
Java:
String [][]show=scanFile("/home/user/Schreibtisch/loagApache.txt");
Map<String, Long> result = Arrays.stream(show).filter(s -> s[1].startsWith("4")).collect(Collectors.groupingBy(s -> s[0], Collectors.counting()));
for (String key : result.keySet()) {
    System.out.print("Key: " + key + " - ");
    System.out.print("Value: " + result.get(key) + "\n");
}
 
Was willst du denn als Ergebnis?
Eine Map<IP, AnzahlAn4XX> oder Map<4XX, List<IP>> oder was völlig anderes?



Generell: nutz Klassen statt Arrays.
 
So?
Java:
    public static void main(String[] args) {
        String[][] show = new String[][]{
                {"195.140.123.100", "200"},
                {"195.140.123.100", "403"},
                {"195.140.123.100", "401"},
                {"195.140.123.100", "200"},
                {"195.140.123.100", "301"},
                {"195.140.123.100", "404"},

                {"195.140.123.200", "200"},
                {"195.140.123.200", "403"},
                {"195.140.123.200", "401"},
                {"195.140.123.200", "200"},
                {"195.140.123.200", "200"},
                {"195.140.123.200", "301"}
        };

        String[][] result = Arrays.stream(show).filter(s -> s[1].startsWith("4")).collect(Collectors.groupingBy(s -> s[0], Collectors.counting()))
                .entrySet().stream().map(e -> new String[]{e.getKey(), String.valueOf(e.getValue())}).toArray(String[][]::new);

        System.out.println(Arrays.deepToString(result));
    }
 
Als Ergebnis brauche ich
ergebnis[][0] -ip`s
ergebnis[][1]-Anzahl an 4** Versuchen
Also einfach nur eine Liste von Ip-Anzahl-Pärchen?

ich brauche einen Array für die Visualisierung mit JFreeChart
Kein Grund, dann für alles Arrays zu nutzen, Darstellung und Logik kann man auch dabei trennen ;)

Was für Charts willst du denn erstellen, ich hab da bisher noch nie zweidimensionale Arrays benötigt o_O
 
Entschuldigung Jungs,alles ok.War mein Fehler.
Was für Charts willst du denn erstellen
final JFreeChart chart = ChartFactory.createScatterPlot...
final XYPlot plot=chart.getXYPlot();
Ich versuche ein kleines Programm zu schreiben um server log file jede 5 sek auslesen und daraus ein chart zu erstellen. Wo man sehen kann welche ip wie viele 400 Status Meldungen verursacht.
So zusagen logfile Überwachung)).
Wie immer auf diesem Forum schnelle Hilfe.Super.Danke.Gehe weiter mein schlechtes code zu schreiben)).
 
Damit es kein dummes copy-paste bleibt habe ich probiert den Code zu analysieren.
Java:
String[][] result = Arrays.stream(show). //aus show wird ein Stream gemacht
filter(s -> s[1].startsWith("4")).                //nur die Einträge mit 4** Status werden herausgenommen
collect(Collectors.groupingBy(s -> s[0], //alle Einträge werden zu ip's gruppiert
Collectors.counting())).                           // und gezählt
entrySet().stream().map(e -> new String[]{e.getKey(), String.valueOf(e.getValue())})//Map<String[]> erstellt?
.toArray(String[][]::new);                           //Map <String[]> zum String [][] umgewandelt?
 
Java:
String[][] result = Arrays.stream(show) //aus show wird ein Stream gemacht
    .filter(s -> s[1].startsWith("4"))                //nur die Einträge mit 4** Status werden herausgenommen
    .collect(Collectors.groupingBy(s -> s[0],   //alle Einträge werden zu ip's gruppiert
                                   Collectors.counting()))  // und gezählt, dabei kommt eine Map<String, Long> raus
    .entrySet().stream()                                 //aus den Einträge der Map wird ein Stream gemacht
    .map(e -> new String[]{e.getKey(), String.valueOf(e.getValue())})  //aus den einzelnen Einträgen (aus jeweils key und value) wird ein String-Array mit zwei Einträgen gemacht, ergibt Stream<String[]>
    .toArray(String[][]::new);                           // Stream<String[]> zum String [][] umgewandelt?
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben