我有一个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]
我从头开始,并使用我发现的代码:
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));
}