我试图根据三列(URL,优先级,长度)中包含的值对以下CSV的降序进行排序,就像执行SQL语言中的order by
一样
起始CSV如下:
url;review;priority;length
1610-bagel-torino;"Ingredienti di qualità.";0;15
1610-bagel-torino;"Il personale è molto gentile.";1;7
7-nani-torino;"Farina buonissima.";0;14
1610-bagel-torino;"Posto carino.";0;9
7-nani-torino;"Arredamento semplice.";1;9
我想获得
url;review;priority;length
7-nani-torino;"Arredamento semplice.";1;9
7-nani-torino;"Farina buonissima.";0;14
1610-bagel-torino;"Il personale è molto gentile.";1;7
1610-bagel-torino;"Ingredienti di qualità.";0;15
1610-bagel-torino;"Posto carino.";0;9
我从这段代码开始,但是仅根据URL和优先级列进行降序排序。
ArrayList<String> list = new ArrayList<>();
BufferedReader br = new BufferedReader(new FileReader("contexts_file/matching/lessico_frasi/"+context+"_ranking.csv"));
String line = "";
while ((line = br.readLine()) != null) {
String[] arr = line.split(";");
list.add(arr[0]+","+arr[2]+","+arr[3]);
}
Collections.sort(list);
Collections.reverse(list);
list.forEach(i -> System.out.println(i));
使用此代码,输出如下:
url;review;priority;length
7-nani-torino;"Arredamento semplice.";1;9
7-nani-torino;"Farina buonissima.";0;14
1610-bagel-torino;"Il personale è molto gentile.";1;7
1610-bagel-torino;"Posto carino.";0;9
1610-bagel-torino;"Ingredienti di qualità.";0;15
最后两行应该颠倒
答案 0 :(得分:0)
可以使用自定义比较器来解决您的问题。正如您自己提到的那样,SQL的order by
子句可满足您的要求。在SQL中,如果2条记录的属性相同,则根据order by
子句的下一个属性比较记录。
一个好的解决方案是为每行创建一个POJO,然后使用自定义比较器对结果进行排序。
private static void customSortCsv() throws IOException {
ArrayList<Key> list = new ArrayList<>();
BufferedReader br = new BufferedReader(new FileReader("data.csv"));
String line;
int idx = 0;
while ((line = br.readLine()) != null) {
if (idx == 0) {
idx++;
continue;
}
String[] arr = line.split(";");
list.add(new Key(arr[0], arr[1], arr[2], arr[3]));
}
Collections.sort(list, (o1, o2) -> {
int c = o2.url.compareTo(o1.url);
if (c != 0) {
return c;
}
c = o2.priority.compareTo(o1.priority);
if (c != 0) {
return c;
}
return o2.length.compareTo(o1.length);
});
list.forEach(System.out::println);
}
static class Key {
String url;
String review;
Integer priority;
Integer length;
public Key(String url, String review, String priority, String length) {
this.url = url;
this.review = review;
this.priority = Integer.parseInt(priority);
this.length = Integer.parseInt(length);
}
@Override
public String toString() {
return url + ";" + review + ";" + priority + ";" + length;
}
}
上面的代码为您提供所需的结果。您可以使用Java中提供的CSV解析器库之一进一步清除代码。