使用与等值不一致的比较器对一组映射条目进行排序

时间:2019-04-18 23:04:48

标签: java sorting set comparator

我正在研究一个项目,通过对数据库中的访问记录按计数进行排序来分析客户的搜索行为,经过一些研究,考虑到情况,我决定使用Map选择具有相同查询的记录字符串作为键,值作为计数,然后将其放入带有比较器的集合中,以按计数排序

从数据库获取:

rawResult = activityDao.findAccessByAcctBranch(acct, branch, new Timestamp(new SimpleDateFormat("yyyy-MM-dd").parse(from).getTime()), endDateCal(from, to));

选择不同的查询:

Map<String, Integer> rawSearch = new HashMap<String, Integer>();
Map<String, Integer> rawDetail = new HashMap<String, Integer>();
for (ActivityDailyaccess ada : rawResult) {
            if (ada.getPage_name().equalsIgnoreCase("Search")) {
                String key = ada.getQuery_input() + "||" + ada.getQuery_type();
                if (rawSearch.containsKey(key)) {
                    rawSearch.put(key, rawSearch.get(key) + 1);
                } else {
                    rawSearch.put(key, 1);
                }
            } else {
                String key = ada.getQuery_input();
                if (rawDetail.containsKey(key)) {
                    rawDetail.put(key, rawDetail.get(key) + 1);
                } else {
                    rawDetail.put(key, 1);
                }
            }
        }
System.out.println("rawSearch size: " + rawSearch.size());
System.out.println("rawDetail size: " + rawDetail.size());

然后通过将它们添加到具有比较器的集合中进行排序:

SortedSet<Map.Entry<String, Integer>> searchResult = new TreeSet<Map.Entry<String, Integer>>(new Comparator<Map.Entry<String, Integer>>() {
            @Override
            public int compare(Map.Entry<String, Integer> e1, Map.Entry<String, Integer> e2) {
                return e2.getValue().compareTo(e1.getValue());
            }
        });
SortedSet<Map.Entry<String, Integer>> detailResult = new TreeSet<Map.Entry<String, Integer>>(new Comparator<Map.Entry<String, Integer>>() {
            @Override
            public int compare(Map.Entry<String, Integer> e1, Map.Entry<String, Integer> e2) {
                return e2.getValue().compareTo(e1.getValue());
            }
        });
searchResult.addAll(rawSearch.entrySet()); rawSearch = null;
detailResult.addAll(rawDetail.entrySet()); rawDetail = null;
System.out.println("searchResult size: " + searchResult.size());
System.out.println("detailResult size: " + detailResult.size());

问题是

rawSearch size: 27060
rawDetail size: 15728
searchResult size: 20
detailResult size: 25

显然,所有具有相同计数的条目都被视为相等且未添加到集合中,我该怎么办? 顺便说一句,我们的服务器使用了相当老的环境(struts 2,hibernate 3,spring 3,tomcat 7),尽管它在Java 8中,但是可以编译lambda表达式,但是环境无法执行二进制代码,因此没有lambda,谢谢。 / p>

0 个答案:

没有答案