gpt4 book ai didi

java - 对值列进行排序 CSV java

转载 作者:行者123 更新时间:2023-12-02 04:36:44 25 4
gpt4 key购买 nike

我尝试根据三列(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

最后两行应该颠倒

最佳答案

您的问题的解决方案可以使用自定义比较器来解决。正如您自己提到的,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 解析器库之一进一步清理代码。

关于java - 对值列进行排序 CSV java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56548608/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com