Я пытаюсь отсортировать arraylist, который был прочитан из файла CSV, чтобы отсортировать по фамилии, почтовому индексу и состоянию - PullRequest
0 голосов
/ 03 июля 2018

Вот мой код, пока он выполняется, но я застрял в том, с чего начать, насколько сортировать его. Я пытался создать код, который сортирует переменную результата, однако я не смог заставить его работать. Чтение и печать необработанных данных - все, что мне удалось сделать до сих пор. Любая помощь будет оценена.

package csv.read.and.sort;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.io.FileWriter;
import java.util.Collections;

/**
 *
 * @author degen
 */
public class CSVReadAndSort {

    public static void main(String[] args) {            
        BufferedReader buffread = null;

        try {
            String line;
            buffread = new BufferedReader (new FileReader ("C:\\Users\\degen\\OneDrive\\Documents\\NetBeansProjects\\CSV Read and Sort\\src\\csv\\read\\and\\sort\\ITCO321_U4IP_sample_data.csv"));

            // How to read file in java line by line?
            while ((line = buffread.readLine()) != null) {
                System.out.println("Raw CSV data: " + line);
                System.out.println("Converted ArrayList data: " + ITCO321_U4IP_sample_data(line) + "\n");
            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (buffread != null) buffread.close();
            } catch (IOException ioexcept) {
                ioexcept.printStackTrace();
            }
        }
    }

    // Utility which converts CSV to ArrayList using Split Operation
    public static ArrayList<String> ITCO321_U4IP_sample_data(String u4ip) {
        ArrayList<String> result = new ArrayList<String>();

        if (u4ip != null) {
            String[] splitData = u4ip.split("\\s*,\\s*");
            for (int i = 0; i < splitData.length; i++) {
                if (!(splitData[i] == null) || !(splitData[i].length() == 0)) {
                    result.add(splitData[i].trim());
                }
            }
        }
        return result;
    }
}

1 Ответ

0 голосов
/ 03 июля 2018

Поскольку вы предоставляете очень мало информации о данных, давайте предположим, что строка CSV содержит следующие данные в следующем порядке:

  • фамилия
  • почтовый индекс
  • состояние
  • имя

Если я правильно понял (« сортирует переменную результата » и ссылается на возвращаемую переменную ITCO321_U4IP_sample_data с именем result), вы хотите отсортировать эти данные результата, чтобы получить их в другом порядок. Для этого вам не нужно сортировать список результатов. Посмотрите на следующий код:

public static List<String> reorder(List<String> input) {
    List<String> reordered = new ArrayList<>(input.size());

    reordered.add(input.get(3)); // first name
    reordered.add(input.get(0)); // last name
    reordered.add(input.get(1)); // zip code
    reordered.add(input.get(2)); // state

    return reordered;
}

Таким образом, вы устанавливаете (копируете) каждое поле строки CSV для чтения в новый List в новом последовательном порядке.

Конечно, вы можете использовать List.sort(...) для получения нового заказа. Но это приведет к переупорядочению List на каждом перемещенном поле. Чем длиннее список и чем больше файлов переупорядочивается, тем менее эффективна сортировка по сравнению с простым копированием, показанным выше.

PS: Вы уже получили несколько общих подсказок в комментариях. Некоторые дополнительные советы:

Также рекомендуется использовать интерфейс в качестве типов возвращаемых данных. Применяя это к вашему методу, вы можете объявить это следующим образом:

public static List<String> ITCO321_U4IP_sample_data(String u4ip) { ... }

При использовании ресурсов, таких как BufferedReader, рекомендуется использовать оператор try-with-resource . Но вы можете прочитать весь файл в одной строке кода, не беспокоясь об обработке ресурсов с помощью nio-API следующим образом:

Files.readAllLines(new File("\\ITCO321_U4IP_sample_data.csv").toPath());
...