сортировать значения столбца CSV Java - PullRequest
0 голосов
/ 11 июня 2019

Я пытаюсь отсортировать по убыванию следующий CSV на основе значений, содержащихся в трех столбцах (url, priority, length), так же, как order by в языке SQL было выполнено

Начальный 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 голосов
/ 11 июня 2019

Решение вашей проблемы может быть решено с помощью пользовательского компаратора.Как вы сами упомянули, что 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;
    }
}

Приведенный выше код дает желаемые результаты.Вы можете дополнительно очистить код, используя одну из библиотек синтаксического анализатора CSV, присутствующих в Java.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...