我有一个基于“ url”列的值排序的CSV文件。 我想为每个“ 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
我想获得:
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");
}
}
答案 0 :(得分:0)
这里的问题是您没有强制使用最大大小3。您的代码只是检查URL是否在列表中一次。
从这里开始:Trying to find all occurrences of an object in Arraylist, in 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<>();
然后您可以像这样将网址放入此Map中:
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;
}
}
希望这会有所帮助。祝你好运。