如何对List 进行排序?

AndsionLee 2013-07-24 11:52:59
public List<Map> process(List<Map> data)
data的数据格式:
[{count=1588847, adress=南京}, {count=973476, adress=南通}, {count=371132, adress=总部},……];

List中有多个Map,每个Map中只有count、adress 2个键值对。要求传入一个无序的data list,返回的按count倒序,期中如果adress出现"总部",那么就把总部在第一条,其他城市在总部之后按count倒序排列。


我是用2个Comparator自定义排序做的,第一个按count倒序排,然后再把得到的list 按adress排,结果adress排是对的了,但是count排就没了。 总之不好结合一起用。

求指教,在线等。
...全文
720 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
小行星0906 2013-07-25
  • 打赏
  • 举报
回复

package com.nyohh.test1;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

public class DataSortTest
{

	public List<SomeBody> process(List<SomeBody> data)
	{
		Map<Integer, String> map2 = new TreeMap(new MyComparator());// 这个是存存储总部的
		for (SomeBody someBody : data)
		{
			if (someBody.getAdress() == "总部")
			{
				data.remove(someBody);
				map2.put(someBody.getCount(), someBody.getAdress());
			}
		}

		// 哥,这里有原来的data剩下的都是没有总部的,排序
		// map2里面的都是含总部的,排序

		// 然后把map2的添加到data的前面,这里我不熟,我要查手册搞,

		return data;
	}

	public static void main(String[] args)
	{
		// public List<Map> process(List<Map> data)
		// data的数据格式:[{count=1588847, adress=南京}, {count=973476, adress=南通}, {count=371132, adress=总部},……];

		ArrayList<SomeBody> arrayList = new ArrayList<SomeBody>();
		arrayList.add(new SomeBody(1588847, "南京"));
		arrayList.add(new SomeBody(973476, "南通"));
		arrayList.add(new SomeBody(371132, "总部"));

	}
}

/**
 * 按count倒序排列
 */
class MyComparator implements Comparator<SomeBody>
{

	@Override
	public int compare(SomeBody o1, SomeBody o2)
	{
		return o2.getCount() - o1.getCount();
	}

}

class SomeBody
{
	public Integer count;
	public String adress;

	public SomeBody(Integer count, String adress)
	{
		this.count = count;
		this.adress = adress;
	}

	public Integer getCount()
	{
		return count;
	}

	public void setCount(Integer count)
	{
		this.count = count;
	}

	public String getAdress()
	{
		return adress;
	}

	public void setAdress(String adress)
	{
		this.adress = adress;
	}

}
草样,我先回去的,老婆打电话了的!
unknownxx 2013-07-25
  • 打赏
  • 举报
回复
既然总部是特例,就不如先把“总部”单独拿出来,将剩余数据排序。 遍历一遍data,取出总部,对剩余data用comparator按count逆序排序,再将总部的数据与排序好的数据合并
小行星0906 2013-07-25
  • 打赏
  • 举报
回复
自己才学水平不足,看到楼主题目思路如下: 遍历,把地址是总部的存入一个,内部按照序号排列;非总部的存入一个,存入时候直接排序存入;然后清空原来的把第1个,第2个分别存入原集合。 MAP的就记得treemap可以排序,新手实现困难,明天过了,后天上班时候我尝试写下,写出来了回头贴上来,写不出来我就继续学习……
AndsionLee 2013-07-25
  • 打赏
  • 举报
回复
package com.zbiti.plugins.multidimension;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MdPluginsManager {
	/**
	 * 多维插件入口
	 * 
	 * @param
	 * @return
	 * @author Andsion
	 */
	public List<Map> process(List<Map> data, String arg, String xField,
			List<String> yFields) {
		List<Map> returnList = new ArrayList<Map>(); // 调用该方法返回的List
		List<Map> dsList = new ArrayList<Map>(); // 用于保存非集团本部的List
		// 1.判断List中是否有本部,如果有则将其加入到本部list中
		for (int i = 0; i < data.size(); i++) {
			if (data.get(i).get("REGION_OUT").toString().indexOf("本部") > 0) {
				// 如果存在集团本部数据、即将其先加入返回的List中,达到数据在上的效果。
				returnList.add(data.get(i));
			} else {
				// 非集团本部的数据保存在地市的list中,后面做排序使用
				dsList.add(data.get(i));
			}
		}
		/* 地市list排序前输出
		 * for (int i = 0; i < dsList.size(); i++) {
		 * System.out.println("地市List排序前---" +
		 * dsList.get(i).get("REGION_OUT").toString() + "-----" +
		 * dsList.get(i).get("USERCOUNTS").toString()); }
		 */
		// 地市list按USERCOUNTS降序排列
		Collections.sort(dsList, new Comparator<Map>() {
			public int compare(Map o1, Map o2) {
				return (Integer) o1.get("USERCOUNTS") > (Integer) o2
						.get("USERCOUNTS") ? ((Integer) o1.get("USERCOUNTS") == (Integer) o2
						.get("USERCOUNTS") ? 0 : -1) : 1;
			}
		});

		/* 地市list排序后输出
		 * for (int i = 0; i < dsList.size(); i++) {
		 * System.out.println("ds排序后---" +
		 * dsList.get(i).get("REGION_OUT").toString() + "-----" +
		 * dsList.get(i).get("USERCOUNTS").toString()); }
		 */

		// 地市list排序完成后,再加入到返回的list中
		returnList.addAll(dsList);
		return returnList;
	}

	public void sort(List<Map<String, Object>> list) {
		Collections.sort(list, new Comparator<Map<String, Object>>() {
			public int compare(Map<String, Object> o1, Map<String, Object> o2) {
				return (Integer) o1.get("USERCOUNTS") > (Integer) o2
						.get("USERCOUNTS") ? ((Integer) o1.get("USERCOUNTS") == (Integer) o2
						.get("USERCOUNTS") ? 0 : -1) : 1;
			}
		});
	}

	

}
谢谢各位,解决了!

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧