基础算法7:从数据库某个字段中取出现次数最多的几条数据形成“热门xxx”

如题所示,有时候我们需要从数据库中的某个表中取出某个字段的数据,并根据其出现的频率在前台页面中显示“热门城市”、“热门商品”等信息。比如说我们要取出所有航线中的“热门城市”,可以这样做:

(1)数据在数据库中是这样的:

基础算法7:从数据库某个字段中取出现次数最多的几条数据形成“热门xxx”

在这里,我们需要查出所有的“出发城市”和“到达城市”,并对每个城市进行计数根据其出现次数来取出几个出现次数最多的城市为热门城市

注:将多个字段的数据合并在一起并且不经过去重处理,可以使用下面这个SQL语句:

1
select DEPARTURE_AIRPORT from USR_AIR_LINE union all select ARRIVAL_AIRPORT from USR_AIR_LINE;

(2)对取出的数据进行计数,排序以及求出最后的“热门城市”:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
package cn.zifangsky.base;
 
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
 
public class PopAirportDemo {
 
    public static void main(String[] args) throws Exception {
        // 读文件
        BufferedReader reader = new BufferedReader(
                new FileReader(new File("C:/Users/Administrator/Desktop/airport.txt")));
        String temp = "";
        List<String> airportCodes = new ArrayList<String>(); // 城市三字码集合
 
        while ((temp = reader.readLine()) != null) {
            airportCodes.add(temp);
        }
        reader.close();
 
        Map<String, Integer> countMap = new HashMap<String, Integer>();  //<城市三字码,总次数>
        //遍历List形成<城市三字码,总次数>键值对
        for (String code : airportCodes) {
            if (!countMap.containsKey(code)) {
                countMap.put(code, 1);
            else {
                countMap.put(code, countMap.get(code) + 1);
            }
 
        }
 
        // 排序
        List<Map.Entry<String, Integer>> list = new ArrayList<Map.Entry<String, Integer>>(countMap.entrySet());
        Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {
            //自定义排序
            public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) {
                return o2.getValue().compareTo(o1.getValue());
            }
        });
 
        List<String> result = new ArrayList<String>();  //热门城市集合
        int point = 0;
        for (Map.Entry<String, Integer> mapping : list) {
            // System.out.println(mapping.getKey() + " -> " +
            // mapping.getValue());
            result.add(mapping.getKey());
            point++;
            //这里取5个热门城市
            if (point >= 5)
                break;
        }
 
        System.out.println(result);
    }
 
}

注:我这里为了简化操作,已经把所有的城市三字码保存到“airport.txt”这个文件中了,这里只专注于整个算法流程而不考虑JDBC等问题



本文转自 pangfc 51CTO博客,原文链接:http://blog.51cto.com/983836259/1772447,如需转载请自行联系原作者