2012-03-31 3 views
0

Ich bin neu in Java und brauche Hilfe für die Sortierung mit HashMap oder TreeMap.Ich muss die Anzahl der Gesamtzahl anzeigen. für welche die Verbindung trennt, um einen bestimmten Computer name.User tritt in den Datumsbereich entspricht, um die Computernamen und die Zählung displayed.Data ist aus mehreren Dateien lesen, die Daten enthalten, wie: FILE 1So sortieren Sie die Anzahl erhalten nach dem Lesen mehrerer Dateien

[C417] ComputerName:KCUTSHALL-PC UserID:GO kcutshall Station 9900 (locked) LanId: | (11/23 11:36:13) | Client is disconnected from agent. 
[C417] ComputerName:KCUTSHALL-PC UserID:GO kcutshall Station 9900 (locked) LanId: | (11/23 11:36:13) | Client is connected to agent 

FILE 2:

[C445] ComputerName:FRONTOFFICE UserID:YB Yenae Ball Station 7A LanId: | (11/23 17:01:55) | Client is disconnected from agent. 
[C445] ComputerName:KCUTSHALL-PC UserID:GO kcutshall Station 9900 (locked) LanId: | (11/23 17:02:00) | Client is disconnected from agent. 

Ausgabe erforderlich:

Computer Name No. of disconnects 
KCUTSHALL-PC   2 
FRONTOFFICE   1 

Anzahl der Trennungen in absteigender order.i versuchte dabei mit HashMap sein sollte, aber didnt bekommen die gewünschte output.Bitte bearbeiten Sie meinen Code oder zeigen Sie mir, wie kann ich eine konsolidierte Anzahl beim Lesen durch mehrere Dateien bekommen. Vielen Dank im Voraus. Hier ist, was ich

schrieb
enter code here 
import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.util.Enumeration; 
import java.util.zip.ZipEntry; 
import java.util.zip.ZipFile; 
import java.util.Scanner; 
import java.util.*; 
import java.text.*; 
import java.util.regex.Pattern; 
import java.util.regex.Matcher; 


public class ReadZip{ 
    public static void main(String args[]) throws ParseException { 
    try { 
Scanner input1=new Scanner(System.in); 

    Scanner input2=new Scanner(System.in); 
    System.out.println("Enter start date"); 
    String userDate1=input1.nextLine(); 
    System.out.println("Enter end date"); 
    String userDate2=input2.nextLine(); 
DateFormat df = new SimpleDateFormat ("MM/dd"); 
     Date d1=df.parse(userDate1); 
     Date d2=df.parse(userDate2); 

     ZipFile zf=new ZipFile("C:\\Users\\Engineeir\\Desktop\\QoS_logs.zip"); 
     Enumeration entries=zf.entries(); 

     BufferedReader input=new BufferedReader(new InputStreamReader(
      System.in)); 
     while (entries.hasMoreElements()) { 
     ZipEntry ze=(ZipEntry) entries.nextElement(); 

    BufferedReader br=new BufferedReader(new InputStreamReader(zf.getInputStream(ze))); 
     String line; String name;String compnames;int lines=0; 
     while ((line=br.readLine())!=null) { 

     String[] st=line.split("\\|",-1); 
if(st.length>1){ 
String dates=st[1]; 
String[] parts=dates.split("-"); 
SimpleDateFormat f=new SimpleDateFormat("(MM/dd"); 
String[] ob=parts[0].split(" "); 
String finaldate=ob[1]; 
HashMap first=new HashMap(); 
Date d3=f.parse(finaldate); 
if((d3.after(d1) && d3.before(d2)) && line.contains("Client is disconnected from agent")==true) 
{ 
compnames=getName(st); 
lines++;} 

else{break;} 
first.put(compnames,lines); 
ArrayList as=new ArrayList(first.entrySet()); 

     Collections.sort(as,new Comparator(){ 
      public int compare(Object o1,Object o2) 
      { 
       Map.Entry e1=(Map.Entry)o1 ; 
       Map.Entry e2=(Map.Entry)o2 ; 
       Integer first=(Integer)e1.getValue(); 
       Integer second=(Integer)e2.getValue(); 
       return second.compareTo(first); 
      } 
    }); 
    Iterator i=as.iterator(); 
     while(i.hasNext()) 
     { 
      System.out.println((Map.Entry)i.next()); 
     } 

} 



     //br.close(); 
} } }catch (IOException e) { 
     e.printStackTrace(); 
    }} 

     public static String getName(String[] st) 
    { 
     String[] name=st[0].split("\\:",-1); 
     String[] comp=name[1].split("\\ ",-1); 

     return(comp[0]); 
    }} 

Antwort

0

Sie können die Einträge in einem Map durch ihre Werte sortieren, nicht ohne wirklich böse, schmutzig und unsicher Hacks. (Das sagt ... Ich finde auch, Ihren Mangel an Generika zu stören.)

Ihre beste Wette so etwas wie

List<Map.Entry<String, Integer>> entries = 
    new ArrayList<Map.Entry<String, Integer>>(map.entrySet()); 
Collections.sort(entries, Collections.reverseOrder(// for descending order 
    new Comparator<Map.Entry<String, Integer>>() { 
    public int compare(
     Map.Entry<String, Integer> entry1, 
     Map.Entry<String, Integer> entry2) { 
     return entry1.getValue().compareTo(entry2.getValue()); 
    } 
    }); 

zu tun ist, was im Grunde ist das, was Sie bereits tun - also im Grunde, Sie habe schon den richtigen Weg dazu.

+0

'" Sie können die Einträge in einer Karte nicht sortieren "...' was ist mit: [Die sortierte Kartenschnittstelle] (http://docs.oracle.com/javase/tutorial/collections/interfaces/sorted-map. html). –

+0

sollten Sie überprüfen, dass die Einträge in den 'compare' Methoden nicht null sind –

+0

@HovercraftFullOfEels: Entschuldigung, ich meinte Sortieren nach _values_. –

Verwandte Themen