首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用LinkedHashSet计数外观

使用LinkedHashSet计数外观
EN

Stack Overflow用户
提问于 2020-04-26 12:23:20
回答 2查看 72关注 0票数 0

我有一个XML文件,需要在其中查找并计数年份标记的外观。例如:

代码语言:javascript
复制
Found year 2020 10 times.
Found year 2017 1 times.
Found year 2019 2 times. 
(...)

为了避免重复使用HashSet的年份。代码:

代码语言:javascript
复制
public class Publications {
    public static void main(String[] args) throws IOException {
        Set<String> publicationYears = new LinkedHashSet<>();
        try (BufferedReader reader = Files.newBufferedReader(Paths.get("dblp-2020-04-01.xml"))) {
            Pattern pattern = Pattern.compile("<year>(.+?)</year>", Pattern.DOTALL);
            for (String line; (line = reader.readLine()) != null; ) {
                Matcher matcher = pattern.matcher(line);
                if (matcher.find()) {
                    String year = matcher.group(1);
                    publicationYears.add(year);
                }
            }
        }

结果:

代码语言:javascript
复制
2010
2002
1992
1994
1993
2006(...)

但是现在我找不到一个高效的代码来统计每年的外观。创建多维数组然后进行搜索将非常缓慢。有什么建议吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-04-26 15:01:03

试试这个:

  • ,我用一张地图替换了这个集。
  • 做这项工作的语句是

代码语言:javascript
复制
        count.compute(year, (k,v)->v == null ? 1 : v + 1); 

  • --如果它第一次遇到它的那一年,它只为一年加1,否则它就会把1加到那一年。

代码语言:javascript
复制
   Map<String, Integer> count = new LinkedHashMap<>();
        try (BufferedReader reader = Files.newBufferedReader(Paths.get("dblp-2020-04-01.xml"))) {
            Pattern pattern = Pattern.compile("<year>(.+?)</year>", Pattern.DOTALL);
            for (String line; (line = reader.readLine()) != null; ) {
                Matcher matcher = pattern.matcher(line);
                if (matcher.find()) {
                    String year = matcher.group(1);
                    count.compute(year, (k,v)->v == null ? 1 : v + 1);
                }
            }
        }
    }

要将它们打印出来,请执行以下操作

代码语言:javascript
复制
count.entrySet().forEach(System.out::println);
票数 1
EN

Stack Overflow用户

发布于 2020-04-26 15:09:48

做这件事有很多种方法。其中一些情况如下:

  1. 将所有年份添加到List中,并使用Collections.frequency,如下所示:

代码语言:javascript
复制
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;

public class Main {
    public static void main(String[] args) {
        List<Integer> years = List.of(2010, 2011, 2013, 2010, 2012, 2010, 2011, 2010, 2014);
        Set<Integer> yearSet = new LinkedHashSet<Integer>(years);
        for (Integer year : yearSet) {
            System.out.println("Found year " + year + " " + Collections.frequency(years, year) + " times");
        }
    }
}

输出:

代码语言:javascript
复制
Found year 2010 4 times
Found year 2011 2 times
Found year 2013 1 times
Found year 2012 1 times
Found year 2014 1 times

  1. 将所有年份添加到List中,然后创建频率为MapMap,如下所示:

代码语言:javascript
复制
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

public class Main {
    public static void main(String[] args) {
        List<Integer> years = List.of(2010, 2011, 2013, 2010, 2012, 2010, 2011, 2010, 2014);
        Map<Integer, Integer> frequencyMap = new LinkedHashMap<Integer, Integer>();
        for (Integer year : years) {
            if (frequencyMap.get(year) == null) {
                frequencyMap.put(year, 1);
            } else {
                frequencyMap.put(year, frequencyMap.get(year) + 1);
            }
        }
        for (Entry<Integer, Integer> entry : frequencyMap.entrySet()) {
            System.out.println("Found year " + entry.getKey() + " " + entry.getValue() + " times");
        }
    }
}

输出:

代码语言:javascript
复制
Found year 2010 4 times
Found year 2011 2 times
Found year 2013 1 times
Found year 2012 1 times
Found year 2014 1 times

  1. 将所有年份添加到List中,然后使用Map::merge创建频率Map,如下所示:

代码语言:javascript
复制
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

public class Main {
    public static void main(String[] args) {
        List<Integer> years = List.of(2010, 2011, 2013, 2010, 2012, 2010, 2011, 2010, 2014);
        Map<Integer, Integer> frequencyMap = new LinkedHashMap<Integer, Integer>();
        years.forEach(year -> frequencyMap.merge(year, 1, (oldValue, newValue) -> oldValue + newValue));
        for (Entry<Integer, Integer> entry : frequencyMap.entrySet()) {
            System.out.println("Found year " + entry.getKey() + " " + entry.getValue() + " times");
        }
    }
}

输出:

代码语言:javascript
复制
Found year 2010 4 times
Found year 2011 2 times
Found year 2013 1 times
Found year 2012 1 times
Found year 2014 1 times
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61440706

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档