Как отсортировать количество полученных, соответствующих различным элементам данных в Java - PullRequest
2 голосов
/ 30 марта 2012

Мне нужна программа, которая читает из нескольких файлов и отображает отчет на основе диапазона дат, введенного пользователем. Данные в файлах выглядят так:

[C445] ComputerName:FRONTOFFICE UserID:YB Yenae Ball Station 7A  LanId: | (11/23 17:01:55) | Client is disconnected from agent.
[C445] ComputerName:FRONTOFFICE UserID:YB Yenae Ball Station 7C  LanId: | (11/23 17:02:00) | Client is connected to agent.
[C7AE] ComputerName:KCUTSHALL-PC UserID:GO kcutshall Station 9901  LanId: | (11/23 13:33:06 - 11/23 13:33:41)|Client is disconnected from agent.

Мне нужен вывод, например:

Computer Name   No.of disconnects
A                   4
B                   2
C                   1

т.е. число отключений для определенного имени компьютера в порядке убывания, соответствующем введенному диапазону дат.Я пытался сделать это, но я не могу получить сводный счетчик для компьютеров, а также не могу выполнить сортировку. Вывод, который я получил:

Имя компьютера Количество отключений

A               1
A               1
A               2
B               1
B               2
C               1
C               1

Пожалуйста, помогите мне в этом.Вот код, который я написал

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];

                        Date d3=f.parse(finaldate);

                        if(d3.after(d1) && d3.before(d2)){
                            compnames=getName(st);
                            if(line.contains("Client is disconnected from agent")==true)
                            {
                                //compnames=getName(st);
                                lines++;
                            }
                        System.out.println(compnames+"\t"+lines);}
                        else{break;}
                        //System.out.println(compnames+"\t"+lines);

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

Ответы [ 2 ]

2 голосов
/ 30 марта 2012

Вместо того, чтобы печатать на ходу, попробуйте накапливать данные на карте (ключ: имя компьютера, значение: количество отключений).Затем отсортируйте ключи на карте и напечатайте итоговые суммы.

0 голосов
/ 30 марта 2012

Попробуйте создать объект, представляющий набор данных, создайте список этих наборов данных, а также Comparator и вызовите Collections.sort(list, comparator).

Или поместите наборы данных в отсортированную коллекцию, например TreeMapи используйте количество соединений в качестве ключа.

Обратите внимание, что если вы хотите объединить данные нескольких файлов, вам необходимо получить любые ранее созданные наборы данных и объединить в них данные нового файла (например,получить набор данных для A, который может иметь число соединений 1 и добавить к нему 2, если текущий файл содержит A -> 2 и т. д.).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...