`
Tristan_S
  • 浏览: 383322 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Map 按照 value排序

 
阅读更多
场景: 需要统计errorMsg的数量, 从大到小排序。 errorMsg为key, 数量为value。

按照key排序 很简单,TreeMap就ok。

按值排序就相对麻烦些了,貌似没有直接可用的数据结构能处理类似需求,需要我们自己转换一下。
Map本身按值排序是很有意义的,很多场合下都会遇到类似需求,可以认为其值是定义的某种规则或者权重。

原理:将待排序Map中的所有元素置于一个列表中,接着使用Collections的一个静态方法 sort(List<T> list, Comparator<? super T> c)
来排序列表,同样是用比较器定义比较规则。排序后的列表中的元素再依次装入Map,为了肯定的保证Map中元素与排序后的List中的元素的顺序一致,使用了LinkedHashMap数据类型。


package com.tristan;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.Map.Entry;

import com.hp.hpsc.logview.client.LogviewClient;
import com.hp.hpsc.logview.po.Link;

public class TestA {

	public static void main(String[] args) throws Exception {

		/*
		 * // linux String file = "/opt/sasuapps/itrc/logs/logview/info.log";
		 * String folder = "/opt/sasuapps/itrc/logs";
		 * 
		 * LogviewClient client = new LogviewClient(); List<Link> list =
		 * client.readDirectory(folder); for (Link link : list) {
		 * System.out.println(link.getName()); }
		 * 
		 * LogviewClient client2 = new LogviewClient(); client2.readLog(file);
		 */

		// now
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		String nowS = "2014-03-18";
		Date nowD = sdf.parse(nowS);
		Calendar nowC = Calendar.getInstance();
		nowC.setTime(nowD);

		String folder = "/opt/sasuapps/itrc/logs/sp4tsusergroup/main/error";

		LogviewClient client = new LogviewClient();
		List<Link> list = client.readDirectory(folder);

		// check file last modified date
		SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
		List<String> fileList = new ArrayList<String>();
		for (Link link : list) {
			if (!link.isFolderFlag()) {

				String s1 = link.getLastModifiedDate();
				Date d1 = sdf1.parse(s1);

				Calendar c1 = Calendar.getInstance();
				c1.setTime(d1);

				Calendar nowMinus2 = Calendar.getInstance();
				nowMinus2.setTime(nowD);
				nowMinus2.add(Calendar.DATE, -2);

				if (c1.after(nowMinus2)) {
					System.out.println(link.getName());
					fileList.add(link.getUri());
				}
			}
		}

		// get the content which match the date like 03/21/2013
		SimpleDateFormat sdf2 = new SimpleDateFormat("MM/dd/yyyy");
		LogviewClient client2 = new LogviewClient();
		List<String> errorList = new ArrayList<String>();

		for (String file : fileList) {
			InputStream input = client2.loadInputStream(file);
			InputStreamReader isr = new InputStreamReader(input);
			BufferedReader br = new BufferedReader(isr);
			String temp = "";
			while ((temp = br.readLine()) != null) {
				if (temp.length() > 10) {
					String s1 = temp.substring(0, 10);
					Date d1 = null;

					try {
						d1 = sdf2.parse(s1);
					} catch (Exception e) {
						continue;
					}

					Calendar c1 = Calendar.getInstance();
					c1.setTime(d1);

					Calendar nowMinus2 = Calendar.getInstance();
					nowMinus2.setTime(nowD);
					nowMinus2.add(Calendar.DATE, -2);

					Calendar nowMinus1 = Calendar.getInstance();
					nowMinus1.setTime(nowD);
					nowMinus1.add(Calendar.DATE, -1);


					if (c1.after(nowMinus2) && c1.before(nowC)) {
						errorList.add(temp);
					}
				}

			}
			br.close();
			isr.close();
			input.close();
		}

		// parse error list
		List<String> errorMsgList = new ArrayList<String>();
		for (String error : errorList) {
			int begin = error.indexOf("{");
			String s1 = error.substring(begin + 1);

			int end = s1.indexOf(":");
			s1 = s1.substring(0, end);
			errorMsgList.add(s1);
		}


		// statistics
		Map<String, Integer> map = new HashMap<String, Integer>();

		for (String temp : errorMsgList) {
			Integer count = map.get(temp);
			map.put(temp, (count == null) ? 1 : count + 1);
		}

		//sort
		Map<String, Integer> resultMap = sortMapByValue(map);

		for (String key : resultMap.keySet()) {
			System.out.println(resultMap.get(key) + " : " + key);
		}

	}

	public static Map<String, Integer> sortMapByValue(
			Map<String, Integer> oriMap) {
		if (oriMap == null || oriMap.isEmpty()) {
			return null;
		}
		
		List<Map.Entry<String, Integer>> entryList = new ArrayList<Map.Entry<String, Integer>>(
				oriMap.entrySet());

		Collections.sort(entryList, new MapValueComparator());

		Map<String, Integer> sortedMap = new LinkedHashMap<String, Integer>();
		
		for(Map.Entry<String, Integer> entry : entryList){
			sortedMap.put(entry.getKey(), entry.getValue());
		}
		
		return sortedMap;
	}
}

class MapValueComparator implements Comparator<Map.Entry<String, Integer>> {

	@Override
	public int compare(Entry<String, Integer> me1, Entry<String, Integer> me2) {

		return me2.getValue().compareTo(me1.getValue());
	}
}



参考
http://blog.csdn.net/top_code/article/details/8528954
分享到:
评论

相关推荐

    Java Map 按照Value排序的实现方法

    以下是关于Java Map按照Value排序的实现方法的详细说明: 1. **HashMap**: - HashMap是基于哈希表实现的,它不保证元素的顺序,插入顺序和遍历顺序可能不同,而且不支持排序。 2. **TreeMap**: - TreeMap基于...

    对Map的key和value进行排序

    对Map的key和value进行排序 对Map的key和value进行排序是Java编程中非常重要的一部分。Map是Java集合框架中的一种数据结构,用于存储键值对。然而,在实际应用中,我们经常需要对Map中的key或value进行排序,以满足...

    Android 对Map按key和value分别排序的实例

    当需要对Map中的数据进行排序时,通常有两种情况:按key排序和按value排序。本文将详细介绍如何在Android环境下对Map进行这两种排序。 首先,我们来讨论按key排序。TreeMap是一个基于红黑树实现的Map,它可以根据...

    对Map按key和value分别排序

    "对 Map 按 key 和 value 分别排序" 摘要:本文主要介绍了 Map 按 key 和 value 分别排序的方法,包括使用 TreeMap 的 key 排序和 value 排序两种方式。 Map 按 key 排序 Map 是键值对的集合接口,它的实现类主要...

    对map里面的value进行排序

    然而,有时我们需要对Map中的值进行排序,例如按照value的大小进行升序或降序排列。这篇博客"对map里面的value进行排序"探讨的就是如何实现这一需求。 首先,我们了解Map接口的基本概念。Map接口不直接支持排序,...

    Hashmap 通过对VALUE排序 源代码

    本文将探讨如何通过对VALUE排序HashMap,并分析相关源代码。 HashMap本身并不支持对值的排序,因为它内部使用哈希表实现,主要关注的是键的哈希计算和冲突解决,而不是元素的顺序。如果需要对HashMap的值进行排序,...

    Java Map按键排序和按值排序

    Map是一种键值对的集合,它可以按照键或值进行排序。下面,我们将详细地介绍Java Map的按键排序和按值排序。 按键排序(sort by key) Java中的TreeMap,V&gt;类可以实现Map的按键排序。TreeMap,V&gt;是一个基于红黑树的...

    java的Map集合中按value值进行排序输出的实例代码

    然而,Map集合本身并不支持按照值(value)进行排序。要实现按value值排序,我们需要借助额外的工具类和方法。在本例中,我们将详细探讨如何在Java中对Map集合按value值进行排序,并给出一个具体的实例代码。 首先...

    java8 stream 操作map根据key或者value排序的实现

    Java8 Stream 操作 Map 根据 Key 或 Value 排序的实现 Java8 中的 Stream 操作为开发者提供了简洁高效的数据处理方式,今天我们将介绍如何使用 Java8 Stream 操作 Map 根据 Key 或 Value 排序的实现。 Map 根据 ...

    JCF(List、Set、Map)学习,实现了<key,value>按value排序噢

    标题中提到的“JCF(List、Set、Map)学习,实现了,value&gt;按value排序”是一个关键点,我们将深入探讨这个话题。 首先,让我们了解List、Set和Map的区别。List是有序的集合,允许重复元素,并且可以保持插入顺序;Set...

    Java Map 按值排序

    然而,在某些场景下,我们可能需要将Map中的元素按照值(value)进行排序。本文将详细介绍如何在Java中实现Map按值排序的几种方法。 1. 使用TreeMap TreeMap是Java中实现Map接口的一个类,它内部使用红黑树数据结构...

    浅谈Java之Map 按值排序 (Map sort by value)

    在主程序中,我们可以创建一个TreeSet对象,它会自动按照Pair的compareTo()方法进行排序。这样,当添加Pair对象到TreeSet时,它们将按值排序。 ```java import java.util.*; class Pair implements Comparable...

    Java Map 按key排序和按Value排序的实现方法

    - 当需要根据value进行排序时,由于Map本身并不直接支持value排序,我们需要使用其他方法。一种常见做法是先将Map的entrySet转换为List,然后使用`Collections.sort()`方法,传入一个Comparator来按value排序。 - ...

    map实现按value升序排序

    本文将详细介绍如何实现`Map`按照值(value)升序排序以及按照键(key)排序。 首先,我们需要了解`Map`的基本概念。`Map`接口是Java集合框架的一部分,它定义了键值对的存储和访问方法。常见的`Map`实现有`HashMap...

    List<Map>中英文排序

    支持一个List&lt;Map&gt;按照MAP中的一个或者多个Key的value值的中英文来排序,自动识别字符和数字(包括[a-zA-z]?[0-9]*)排序

    对于java map类排序

    然而,有时候我们可能需要对Map按照键(key)或者值(value)进行排序。这里,我们讨论的是“对于Java Map类排序”,特别是通过键进行排序。 在给定的代码中,有一个名为`mapSortByKey`的方法,该方法接收一个未...

    java map 集合 排序

    然而,Map默认不保证元素的顺序,如果需要按照特定规则进行排序,我们需要用到特定类型的Map或者手动排序。本文将深入探讨Java Map集合的排序方法。 一、TreeMap:自动排序 1. **TreeMap** 是一个基于红黑树实现的...

    STL_map初始化和排序

    在STL中,`map`是一个关联容器,它存储键值对(key-value pairs),其中每个键都是唯一的,并且通过键进行排序。`map`的实现通常基于红黑树,这保证了其在插入、删除和查找操作上的平均时间复杂度为O(log n)。 在...

    Map排序

    默认情况下,Map并不保证其元素的顺序,但有些场景下我们需要按照特定的规则对Map进行排序,比如按照键的自然顺序或自定义顺序。 首先,我们要了解Map的两种主要实现类:HashMap和TreeMap。HashMap是非排序的,而...

Global site tag (gtag.js) - Google Analytics