排序值列CSV Java

时间:2019-06-11 17:04:33

标签: java csv sorting

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

最后两行应该颠倒

1 个答案:

答案 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解析器库之一进一步清除代码。