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

本文介绍了一种从数据库中提取并统计“热门城市”的算法流程。通过读取包含城市三字码的文件,利用Java实现对这些城市出现频率的统计与排序,最终筛选出出现次数最多的前五个城市。

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

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

wKiom1czVEbxkDl0AABsbJonIwU594.png

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

注:将多个字段的数据合并在一起并且不经过去重处理,可以使用下面这个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,如需转载请自行联系原作者

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值