1.需求场景
读取指定格式字符数据,将数据 按照指定字段分类,并对分类和分类数据按照指定字段排序
2.项目环境
普通java web 项目
3.实现方法
(1) 集合数据实体类
public class Food {
private String type;//分类名称
private String name;//食品名称
private String rate;//占比值(数字)
getter/setter略.....
}
public class FoodGroup {
private String type;//食品分类
private String List<Food> list;//食品集合
private String totalrate;//该分类总的占比值(数字)
getter/setter略.....
}
(2)指定字段分类
//食品分类名称 分组
public List<FoodGroup> groupType() {
List<Food> list =FileUtil.getFoodList();//从文件获取食品信息
Map<String, List<Food>> resultMap = new HashMap<String, List<Food>>();
for (Food f : list) {
// map中key已存在,将该数据存放到同一个key的map中
if (resultMap.containsKey(f.getType())) {
resultMap.get(f.getType()).add(f);
} else {
// map中不存在,新建key,用来存放数据
List<Food> tmpList = new ArrayList<Food>();
tmpList.add(f);
resultMap.put(tag.getType(), descByRate(tmpList));
}
}
return handerMap(resultMap);
}
(3)分类排序与分类数据排序
//食品按权重排序
public List<Food> descByRate(List<Food> list){
Collections.sort(list, new Comparator<Food>(){
public int compare(Food o1, Food o2) {
double v1=Double.valueOf(o1.getRate());
double v2=Double.valueOf(o2.getRate());
//按照权重进行降序排列
if( v1<v2 ){
return 1;
}
if(v1==v2){
return 0;
}
return -1;
}
});
return list;
}
//累计食品分类权值
public String countRate(List<Food> list){
double rate = 0;
for (int i = 0; i < list.size(); i++) {
rate+=Double.valueOf(list.get(i).getRate());
}
return String.format("%.2f", rate).toString();
}
//重新构建对象
public List<FoodGroup> buildFoodGroup(Map<String, List<Food>> map){
List<FoodGroup> fglist = new ArrayList<FoodGroup>();
for (String key : map.keySet()) {
List<Food> list = map.get(key);
String totalRate = countRate(list);
FoodGroup fg = new FoodGroup();
fg.setTotalRate(totalRate);
fg.setFood(list);
fg.setType(key);
fglist.add(fg);
}
return descByTotalRate(fglist);
}
//按食品分类汇总权值排序
public List<FoodGroup> descByTotalRate(List<FoodGroup> list){
Collections.sort(list, new Comparator<FoodGroup>(){
public int compare(FoodGroup o1, FoodGroup o2) {
double v1=Double.valueOf(o1.getTotalRate());
double v2=Double.valueOf(o2.getTotalRate());
//按照权重进行降序排列
if( v1<v2 ){
return 1;
}
if(v1==v2){
return 0;
}
return -1;
}
});
return list;
}