在最近的项目中,有一个"常用店铺列表" 的功能,而我想要拿到常用店铺列表,就必须从用户以往的订单中找出店铺,那么,必然就要考虑到每一个常用店铺的下单频率,根据下单频率进行排序,拿出一个真正的常用店铺列表;
好了,下面就是我的简单代码:
package com.xt.shop.until.doubleUtil;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class ArrayUtil {
/**
*<p>方法说明: TODO 按值的频率大小排列Set集合
*<p>参数说明: List<Integer> intList 无序集合
*<p>参数说明: Integer size 返回值集合大小
*<p>创建时间: 2017年11月9日 上午9:40:25
*<p>创 建 人: geYang
**/
public static List<Integer> arrMax(List<Integer> intList,Integer size){
Set<Integer> intSet = new HashSet<>();
intSet.addAll(intList);
System.out.println("集合Set=="+intSet);
Map<Integer,Integer> intMap = new HashMap<>();
ArrayList<Integer> frequencylist = new ArrayList<Integer>(); //出现频率集合
for(Integer vlue : intSet){
int frequency = 0; //出现频率
for(Integer i : intList){
if(vlue==i){
frequency++;
}
}
intMap.put(vlue, frequency); //值,频率
frequencylist.add(frequency);//次数集合
}
System.out.println("Map<数值,频率>=="+intMap);
List<Integer> intResultList = new ArrayList<>();
//对频率从大到小进行排序
Collections.sort(frequencylist,(a,b)->b.compareTo(a));
for(Integer frequency : frequencylist){ //对频率进行循环
for(Integer vlue : intSet){ //对Map进行循环
if(intMap.get(vlue) == frequency){
intResultList.add(vlue);
intMap.remove(vlue);
}
if(intResultList.size()==size){
break;
}
}
}
System.out.println("结果数值List=="+intResultList);
return intResultList;
}
public static void main(String[] args) {
List<Integer> intList = new ArrayList<>();
Integer[] arr = {1,2,2,3,3,3,4,4,4,4,5,5,5,5,5,6,7,8,9,10,11};
intList = Arrays.asList(arr);
System.out.println(intList);
arrMax(intList,10);
}
}
能力有限,只能写出这种程度,其中的各种数据转换和循环有些多,感觉不是很简洁完美, 还请哪位大牛能来个更简洁明了的工具,不胜感激.....