Collections groupingBy mit Bedingung

Diskutiere groupingBy mit Bedingung im Java Basics - Anfänger-Themen Bereich.
Dimax

Dimax

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.
 
Tarrew

Tarrew

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");
}
 
mrBrown

mrBrown

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.
 
Tarrew

Tarrew

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));
    }
 
mrBrown

mrBrown

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
 
Dimax

Dimax

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)).
 
Dimax

Dimax

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?
 
mrBrown

mrBrown

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?
 
Thema: 

groupingBy mit Bedingung

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben