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

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

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

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

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

select DEPARTURE_AIRPORT from USR_AIR_LINE union all select ARRIVAL_AIRPORT from USR_AIR_LINE;

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

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等问题

时间: 2024-10-17 10:43:18

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

一个字符串中连续出现次数最多的子串【转】一个字符串中连续出现次数最多的子串【转】

问题描述: 求一个字符串中连续出现次数最多的子串,子串的长度可以是 1 . 分析问题: 乍一看,好像无处下手.简单的穷举效率太低,随着输入的文本增长,时间复杂度和空间复杂度就会火箭般窜升至无法接受的地步. 我们需要寻找规律. 假设存在一个长度为 N 的子串 S 出现的次数最多.那么它具有哪些特点呢? S 的任一子串的出现次数不少于 S 的出现次数 S 中不会出现重复的子串字符 S 中不会出现重复的字符 组成 S 的每一个字符.每一个子串的出现次数都和 S 一样 “S 中不会出现重复的字符”,“组

js实现从字符串中查找出现次数最多的字符的两种解决办法

方法一:正则表达式匹配 1 var str = "adadfdfseffserfefsefseeffffftsdg"; 2 var maxLength = 0; var result = ""; 3 while (str != '') { 4 oldStr = str; 5 getStr = str.charAt(0); 6 str = str.replace(new RegExp(getStr, "g"), ""); 7 i

只用2GB内存在20亿个整数中找到出现次数最多的数

[题目] 有一个包含20亿个全是32位整数的大文件,在其中找到出现次数最多的数. [要求] 内存限制为2GB. [解答] 想要在很多整数中找到出现次数最多的数,通常的做法是使用哈希表对出现的每一个数做词频统计,哈希表的key是某一个整数,value是这个数出现的次数.就本题来说,一共有20亿个数,哪怕只是一个数出现了20亿次,用32位的整数也可以表示其出现的次数而不会产生溢出,所以哈希表的key需要占用4B,value也是4B.那么哈希表的一条记录(key,value)需要占用8B,当哈希表记录

sqlserver数据库 去除字段中空格,换行符,回车符(使用replace语句)

SQL中可以使用Replace函数来对某个字段里的某些字符进行替换操作,语法如下: 语法 REPLACE ( original-string, search-string, replace-string ) 参数 如果有某个参数为 NULL,此函数返回 NULL. original-string     被搜索的字符串.可为任意长度. search-string     要搜索并被 replace-string 替换的字符串.该字符串的长度不应超过 255 个字节.如果 search-strin

【面试被虐】如何只用2GB内存从20亿,40亿,80亿个整数中找到出现次数最多的数?

这几天小秋去面试了,不过最近小秋学习了不少和位算法相关文章,例如 [面试现场]如何判断一个数是否在40亿个整数中? [算法技巧]位运算装逼指南 对于算法题还是有点信心的,,,,于是,发现了如下对话. 20亿级别 面试官:如果我给你 2GB 的内存,并且给你 20 亿个 int 型整数,让你来找出次数出现最多的数,你会怎么做? 小秋:(嗯?怎么感觉和之前的那道判断一个数是否出现在这 40 亿个整数中有点一样?可是,如果还是采用 bitmap 算法的话,好像无法统计一个数出现的次数,只能判断一个数是

Spark实战--寻找5亿次访问中,访问次数最多的人

问题描述 对于一个大型网站,用户访问量尝尝高达数十亿.对于数十亿是一个什么样的概念,我们这里可以简单的计算一下.对于一个用户,单次访问,我们通常会记录下哪些数据呢? 1.用户的id 2.用户访问的时间 3.用户逗留的时间 4.用户执行的操作 5.用户的其余数据(比如IP等等) 我们单单从用户id来说,比如10011802330414,这个ID,那么我们一个id差不多就是一个long类型,因为在大量数据存储的时候,我们都是采用文本存储.因此对于5亿个用户ID,完全存储在磁盘当中,大概是5G的大小,

求一个字符串中连续出现次数最多的子串

解题思路 例如字符串"abababc",最多连续出现的为ab,连续出现三次.要和求一个字符串中的最长重复子串区分开来,还是上面的字符串,那么最长的重复子串为abab.两个题目的解法有些类似,都用到了后缀数组这个数据结构.求一个字符串中连续出现的次数最多的子串,首先生成后缀数组例如上面的字符串为: abababc bababc ababc babc abc bc c 可以看出第一个后缀数组和第三个后缀数组的起始都为ab,第5个后缀数组也为ab.可以看出规律来,一个字符串s,如果第一次出现

查找输入字符串中出现字符次数最多的那个字和重复次数

public class chongfu { //找出字符串中重复次数最多的那个字符: /** * public static void main(String[] args){ System.out.println("请输入字符串"); Scanner a = new Scanner(System.in); String b=a.nextLine(); int count=0; int d=0; char t = 0; for(int i=0;i<b.length();i++)

按某一字段分组取最大(小)值所在行的数据 分拆列值(转) 日期的推算

数据如下:name val memoa 2 a2(a的第二个值)a 1 a1--a的第一个值a 3 a3:a的第三个值b 1 b1--b的第一个值b 3 b3:b的第三个值b 2 b2b2b2b2b 4 b4b4b 5 b5b5b5b5b5*/--创建表并插入数据:create table tb(name varchar(10),val int,memo varchar(20))insert into tb values('a', 2, 'a2(a的第二个值)')insert into tb v