Выберите строки для значения столбца из CSV Java - PullRequest
0 голосов
/ 18 июня 2019

У меня заказан CSV на основе значения столбца "url".Я хотел бы выбрать первые три строки для каждого значения "URL".Если строки для значения url меньше 3 (2 или 1), я бы все равно выбрал их.

Начальный CSV следующий:

 url;review;priority;length
 zonk-di-brigada-igor-torino;"Ora sono tornati i vecchi gestori.";0;15
 zonk-di-brigada-igor-torino;"Buona qualità dei prodotti.";0;13
 zonk-di-brigada-igor-torino;"Ultimamente però l'apericena è scaduto.";0;13
 zonk-di-brigada-igor-torino;"I coktail sono buoni.";0;11
 zonk-di-brigada-igor-torino;"Per non parlare dei cocktail.";0;10
 zonk-di-brigada-igor-torino;"Locale molto bello.";0;7
 zichella-torino;"Che pasticceria";1;19
 zichella-torino;"Bar pasticceria di classe.";1;18

Iхочу получить:

 url;review
 zonk-di-brigada-igor-torino;"Ora sono tornati i vecchi gestori."
 zonk-di-brigada-igor-torino;"Buona qualità dei prodotti."
 zonk-di-brigada-igor-torino;"Ultimamente però l'apericena è scaduto."
 zichella-torino;"Che pasticceria"
 zichella-torino;"Bar pasticceria di classe."

Я начал с этого кода, но выбрал только одну строку.

 ArrayList<String> urls = new ArrayList<String>();
 String url, text;
 for (CSVRecord csvRecord : csvParserMatrix) 
 {
   url = csvRecord.get("url");
   text = csvRecord.get("review");
   if(!urls.contains(url))
   {
        urls.add(url);
        bw.write(url+";"+'"'+text+'"'+"\n");
   }
 }

1 Ответ

0 голосов
/ 18 июня 2019

Проблема здесь в том, что вы не используете максимальный размер 3. Ваш код просто проверяет, существует ли URL-адрес в списке один раз.

Отсюда: Попытка найти все вхожденияобъект в Arraylist, в java Я изменил метод таким образом, чтобы получить количество вхождений.

static int indexOfAll(String obj, List<String> list) {
    final List<Integer> indexList = new ArrayList<>();
    int count = 0;
    for (int i = 0; i < list.size(); i++) {
        if (obj.equals(list.get(i))) {
            ++count;
        }
    }
    return count;
}

Если вы используете Java 8+, вы можете использовать потоки, подобные этому:

urls.stream().filter(string -> string.equals(url)).count();

И теперь в вашем условии if вы можете просто вызвать этот метод, чтобы проверить количество вхождений URL-адреса в списке и установить ограничение в 3.

Но это только если вы хотите придерживаться ArrayList.

Более эффективным способом было бы использование карты.Вы можете создать карту, например:

Map<String, Integer> URLCount = new HashMap<>();

И затем вы можете просто добавить URL на эту карту следующим образом:

if (URLCount.containsKey(url)) {
    int count = URLCount.get(url);
    URLCount.put(url, ++count);
} else {
    URLCount.put(url, 1);
}

Или, еще лучше:

URLCount.put(url, (URLCount.getOrDefault(url, 0) + 1));

И затем, чтобы установить ограничение 3, вы можете получить значение с карты.

if (URLCount.containsKey(url)) {
    int count = URLCount.get(url);
    if (count == 3) {
        continue;
    }
}

Надеюсь, это поможет.Удачи.

...