CSV文件到ArrayList,按2个不同的列对其进行排序,然后打印

问题描述 投票:-1回答:1

我有一个CSV文件,每行格式为:20个字符字符串,10个字符字符串,4个字符字符串和一个双精度字符。

目标是读取文件并将信息存储到列表集合中。

然后使用比较器在第三列和第一列上进行排序。

我想知道如何对它们进行排序,以及是否有更简单的方法来进行排序。理想情况下,打印将以

之类的间距隔开
System.out.printf("%-20s%-10s%-4s%10s%n", Result.get(0), Result.get(1), Result.get(2), Result.get(3));

我尝试过,但是在不需要“ System.out.println(CSVtoArrayList(Line));”的情况下无法显示线。我当前的代码:

public static void main(String[] args) {

    BufferedReader Buffer = null;

    try {
        Scanner scanner = new Scanner(System.in);
        System.out.println("Enter file name: ");
        String input1 = scanner.nextLine(); 
        String Line;
        Buffer = new BufferedReader(new FileReader(input1));

        while ((Line = Buffer.readLine()) != null) {
            System.out.println(CSVtoArrayList(Line));

            }

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


public static ArrayList<String> CSVtoArrayList(String CSV) {
    ArrayList<String> Result = new ArrayList<String>();

    if (CSV != null) {
        String[] splitData = CSV.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;

}

当前显示出类似:

Enter file name: 
comma.txt
[frist movei, Bob, 1999, 24.98]
[first mobie, Steve, 1999, -345.67]
[first movie, Pam, 1999, 0.00]
[other moive, Sam, 1562, -42.16]
[something, Sue, 8951, 224.62]
java arrays sorting arraylist comparator
1个回答
0
投票

我从头开始,并使用我发现的代码:

How to sort csv file by two columns in java?

我达到了要求的结果

private static final String COLUMN_SEPARATOR = ",";

public static void main(String[] args) throws Exception
{
    Scanner scanner = new Scanner(System.in);
    System.out.println("Enter file name: ");
    String input1 = scanner.nextLine(); 
    String csvFile = input1;
    InputStream inputStream = new FileInputStream(input1);
    List<List<String>> lines = readCsv(inputStream);
    Comparator<List<String>> c2 = createAscendingComparator(2);
    Comparator<List<String>> c0 = createAscendingComparator(0);
    Comparator<List<String>> comparator = createComparator(c2, c0);
    Collections.sort(lines, comparator);
    printCsv(lines);        
}

private static List<List<String>> readCsv(
    InputStream inputStream) throws IOException
{
    BufferedReader reader = new BufferedReader(
        new InputStreamReader(inputStream));
    List<List<String>> lines = new ArrayList<List<String>>();

    String line = null;

    while (true)
    {
        line = reader.readLine();
        if (line == null)
        {
            break;
        }
        List<String> list = Arrays.asList(line.split(COLUMN_SEPARATOR));
        lines.add(list);
    }
    return lines;
}

private static void printCsv(List<List<String>> lines) 
    throws IOException
{

    for (List<String> list : lines)
    {
        System.out.printf("%-20s%-10s%-4s%10s%n", list.get(0),list.get(1),list.get(2), list.get(3));

    }

}

private static <T> Comparator<T>
    createComparator(Comparator<? super T>... delegates)
{
    return (t0, t1) -> 
    {
        for (Comparator<? super T> delegate : delegates)
        {
            int n = delegate.compare(t0, t1);
            if (n != 0)
            {
                return n;
            }
        }
        return 0;
    };
}

private static <T extends Comparable<? super T>> Comparator<List<T>>
    createAscendingComparator(int index)
{
    return createListAtIndexComparator(Comparator.naturalOrder(), index);
}

private static <T extends Comparable<? super T>> Comparator<List<T>>
    createAscendingComparator1(int index)
{
    return createListAtIndexComparator(Comparator.naturalOrder(), index);
}

private static <T> Comparator<List<T>>
    createListAtIndexComparator(Comparator<? super T> delegate, int index)
{
    return (list0, list1) -> 
        delegate.compare(list0.get(index), list1.get(index));
}
© www.soinside.com 2019 - 2024. All rights reserved.