Как сохранить идентификатор и имя в паре, сортируя идентификатор в одиночку? - PullRequest
0 голосов
/ 01 марта 2020

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

14000027,Sofia Bonfiglio
14000053,Ashlee Capellan
14000310,Dona Mcinnes
14000436,Maricela Landreneau
14000688,Elinor Raco

, но исходный идентификатор для этих имен:

14495655    Sofia Bonfiglio
14224671    Ashlee Capellan
14707100    Dona Mcinnes
14644633    Maricela Landreneau
14147356    Elinor Raco

Я сейчас застрял. Любые советы мне очень помогут, спасибо!

Вот мой код:

public class NameSorting{
    private static void readFiles(String inFileName) throws IOException{
        FileInputStream fileStream = null;
        InputStreamReader rdr;
        BufferedReader bufRdr;
        int lineNum;
        String line;

        try{
            fileStream = new FileInputStream(inFileName);
            rdr = new InputStreamReader(fileStream);
            bufRdr = new BufferedReader(rdr);

            String[] nameArray = new String[7000];
            Long[] idArray = new Long[7000];
            String[] rowArray = new String[2];
            int i = 0;

            lineNum = 0;
            line = bufRdr.readLine();
            while (line != null){
                lineNum++;
                rowArray = processLine(line);
                //stores the returned split value into two arrays, idArray and nameArray
                idArray [i] = Long.parseLong(rowArray[0]);
                nameArray [i] = rowArray[1];
                i++;

                line = bufRdr.readLine();
            }
            sorts(idArray, nameArray); //sorts the file by id
            fileStream.close();
        }
        catch(IOException e){
            if (fileStream != null){
                try {
                    fileStream.close();
                }
                catch (IIOException ex2){
                }
            }
            System.out.println("Error in file processing" + e.getMessage());
        }
    }

    private static String[] processLine(String csvRow){ //takes in a row from the CSV file and splits it with comma, returns rowArray.
        String[] rowArray = new String[2];
        rowArray = csvRow.split(",");
        return rowArray;
    }

    private static void write(Long[] idArray, String[] nameArray) {
        FileOutputStream fileStrm = null;
        PrintWriter pw;
        String inFileName = "Sorted.txt";

        try {
            fileStrm = new FileOutputStream(inFileName);
            pw = new PrintWriter(fileStrm);
            for (int k = 0; k < idArray.length; k++){
                pw.println(idArray[k] + "," + nameArray[k]);
            }

            pw.close();
        } catch (IOException e) {
            System.out.println("Error in writing to file: " + e.getMessage());
        }
    }

    private static void sorts(Long[] idArray, String[] nameArray){
        for (int pass = 1; pass < idArray.length ; pass++){
            int hold = pass;
            Long temp = idArray[hold];
            while (hold > 0 && (idArray[hold - 1] > temp)){
                idArray[hold] = idArray[hold - 1];
                hold = hold - 1;
            }
            idArray[hold] = temp;
        }
        write(idArray, nameArray);
    }
    public static void main(String[] args) throws IOException {
        Scanner sc = new Scanner(System.in);

        System.out.println("Please enter file name");
        String inp = sc.next();
        readFiles(inp);
        System.out.println("Done");

    }
}

1 Ответ

0 голосов
/ 05 марта 2020

Можно решить проблему, используя Treemap<Integer, String>, используя идентификатор в качестве ключа, а затем с помощью потоков преобразовать карту в массив, как показано ниже:

public class NameSorting {
    public static void main(String[] args) {
        String[] lines = {"14495655 Sofia Bonfiglio",
                          "14224671 Ashlee Capellan",
                          "14707100 Dona Mcinnes",
                          "14644633 Maricela Landreneau",
                          "14147356 Elinor Raco" };
        Map<Long, String> map = new TreeMap<>();
        for (String line : lines) {
            String[] arr = line.split(" ", 2);
            map.put(Long.parseLong(arr[0]), arr[1]);
        }
        String[] mapAsStringArray = map.keySet().stream()
                  .map(key -> key + "," + map.get(key))
                  .toArray(String[]::new);
        for (String line : mapAsStringArray) {
            System.out.println(line);
        }
    }
}

Вывод будет упорядочен:

14147356,Elinor Raco
14224671,Ashlee Capellan
14495655,Sofia Bonfiglio
14644633,Maricela Landreneau
14707100,Dona Mcinnes
...