十九、Java中对Map(HashMap,TreeMap,Hashtable等)的排序
首先简单说一下他们之间的区别:
HashMap: 最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度。HashMap最多只允许一条记录的键为Null(多条会覆盖);允许多条记录的值为 Null。非同步的。
TreeMap: 能够把它保存的记录根据键(key)排序,默认是按升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。TreeMap不允许key的值为null。非同步的。
Hashtable: 与 HashMap类似,不同的是:key和value的值均不允许为null;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了Hashtale在写入时会比较慢。
LinkedHashMap: 保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.在遍历的时候会比HashMap慢。key和value均允许为空,非同步的。
TreeMap默认按key进行升序排序,如果想改变默认的顺序,可以使用比较器:
Map<String,String> map = new TreeMap<String,String>(new Comparator<String>(){ public int compare(String obj1,String obj2){ //降序排序 return obj2.compareTo(obj1); } }); map.put("month", "The month"); map.put("bread", "The bread"); map.put("attack", "The attack"); Set<String> keySet = map.keySet(); Iterator<String> iter = keySet.iterator(); while(iter.hasNext()){ String key = iter.next(); System.out.println(key+":"+map.get(key)); }
如果要对 TreeMap 按照 value 的值进行排序,或者对 HashMap,Hashtable,LinkedHashMap 进行排序,则可以使用 Map.Entry<K,V> 接口结合List实现:
eg.1 对TreeMap按照value值升序:
List<Map.Entry<String,String>> mappingList = null; Map<String,String> map = new TreeMap<String,String>(); map.put("aaaa", "month"); map.put("bbbb", "bread"); map.put("ccccc", "attack"); //通过ArrayList构造函数把map.entrySet()转换成list mappingList = new ArrayList<Map.Entry<String,String>>(map.entrySet()); //通过比较器实现比较排序 Collections.sort(mappingList, new Comparator<Map.Entry<String,String>>(){ public int compare(Map.Entry<String,String> mapping1,Map.Entry<String,String> mapping2){ return mapping1.getValue().compareTo(mapping2.getValue()); } }); for(Map.Entry<String,String> mapping:mappingList){ System.out.println(mapping.getKey()+":"+mapping.getValue()); }
eg.2 对HashMap(或Hashtable,LinkedHashMap)按照key的值升序:
List<Map.Entry<String,String>> mappingList = null; Map<String,String> map = new HashMap<String,String>(); map.put("month", "month"); map.put("bread", "bread"); map.put("attack", "attack"); //通过ArrayList构造函数把map.entrySet()转换成list mappingList = new ArrayList<Map.Entry<String,String>>(map.entrySet()); //通过比较器实现比较排序 Collections.sort(mappingList, new Comparator<Map.Entry<String,String>>(){ public int compare(Map.Entry<String,String> mapping1,Map.Entry<String,String> mapping2){ return mapping1.getKey().compareTo(mapping2.getKey()); } }); for(Map.Entry<String,String> mapping:mappingList){ System.out.println(mapping.getKey()+":"+mapping.getValue()); }
二十、Java 中 BigDecimal 的相关用法
1.BigDecimal divide(BigDecimal divisor, int scale, int roundingMode) 方法
BigDecimal b = new BigDecimal(“10.01”);
b.divide(1,2,4)
1 表示除以 1
2 表示2位小数
4 是BigDecimal.ROUND_HALF_UP,也就是最常见的四舍五入,大于一般则向上舍入,否则向下舍入
2. java中的BigDecimal和String的相互转换
//数字字符串 String StrBd="1048576.1024"; //构造以字符串内容为值的BigDecimal类型的变量bd BigDecimal bd=new BigDecimal(StrBd); //设置小数位数,第一个变量是小数位数,第二个变量是取舍方法(四舍五入) bd=bd.setScale(2, BigDecimal.ROUND_HALF_UP); //转化为字符串输出 String OutString=bd.toString();
3. java中的 BigDecimal加减乘除运算
package test1; import java.math.BigDecimal; /** * 由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精 确的浮点数运算,包括加减乘除和四舍五入。 */ public class Arith { // 默认除法运算精度 private static final int DEF_DIV_SCALE = 10; // 这个类不能实例化 private Arith() { } /** * 提供精确的加法运算。 * * @param v1 * 被加数 * @param v2 * 加数 * @return 两个参数的和 */ public static double add(double v1, double v2) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.add(b2).doubleValue(); } /** * 提供精确的减法运算。 * * @param v1 * 被减数 * @param v2 * 减数 * @return 两个参数的差 */ public static double sub(double v1, double v2) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.subtract(b2).doubleValue(); } /** * 提供精确的乘法运算。 * * @param v1 * 被乘数 * @param v2 * 乘数 * @return 两个参数的积 */ public static double mul(double v1, double v2) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.multiply(b2).doubleValue(); } /** * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到 小数点以后10位,以后的数字四舍五入。 * * @param v1 * 被除数 * @param v2 * 除数 * @return 两个参数的商 */ public static double div(double v1, double v2) { return div(v1, v2, DEF_DIV_SCALE); } /** * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指 定精度,以后的数字四舍五入。 * * @param v1 * 被除数 * @param v2 * 除数 * @param scale * 表示表示需要精确到小数点以后几位。 * @return 两个参数的商 */ public static double div(double v1, double v2, int scale) { if (scale < 0) { throw new IllegalArgumentException( "The scale must be a positive integer or zero"); } BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue(); } /** * 提供精确的小数位四舍五入处理。 * * @param v * 需要四舍五入的数字 * @param scale * 小数点后保留几位 * @return 四舍五入后的结果 */ public static double round(double v, int scale) { if (scale < 0) { throw new IllegalArgumentException( "The scale must be a positive integer or zero"); } BigDecimal b = new BigDecimal(Double.toString(v)); BigDecimal one = new BigDecimal("1"); return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue(); } }
二十一、Java ,JSON 之间互相转换
jackson-databind-2.2.1.jar
jackson-annotations-2.2.1.jar
jackson-core-2.2.1.jar
jackson-mapper-asl-1.9.13.jar
jackson-core-asl-1.9.13.jar
import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; import org.codehaus.jackson.JsonGenerationException; import org.codehaus.jackson.map.DeserializationConfig; import org.codehaus.jackson.map.JsonMappingException; import org.codehaus.jackson.map.ObjectMapper; import org.codehaus.jackson.type.JavaType; public class JsonUtil { private static ObjectMapper mapper = new ObjectMapper(); // can reuse, share // globally static { mapper.configure( DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false); } /** * 把 java 对象转化为 json 对象 */ public static <T> String java2json(T t) { String json = null; try { json = mapper.writeValueAsString(t); // 把 java 对象转化为 json 对象 } catch (JsonGenerationException ex) { Logger.getLogger(JsonUtil.class.getName()).log(Level.SEVERE, null, ex); } catch (JsonMappingException ex) { Logger.getLogger(JsonUtil.class.getName()).log(Level.SEVERE, null, ex); } catch (IOException ex) { Logger.getLogger(JsonUtil.class.getName()).log(Level.SEVERE, null, ex); } return json; } /** * 把 json 对象转化为 java 对象 * */ public static <T> T json2java(String json, Class<T> valueType) { T obj = null; try { obj = mapper.readValue(json, valueType); // 把 json 对象转化为 java 对象 // User user = mapper.readValue(json, User.class); // 把 json 对象转化为 // java 对象 } catch (JsonGenerationException ex) { Logger.getLogger(JsonUtil.class.getName()).log(Level.SEVERE, null, ex); } catch (JsonMappingException ex) { Logger.getLogger(JsonUtil.class.getName()).log(Level.SEVERE, null, ex); } catch (IOException ex) { Logger.getLogger(JsonUtil.class.getName()).log(Level.SEVERE, null, ex); } return obj; } public static <T> List<T> json2javaList(String json, Class<T> valueType) { List<T> obj = null; try { JavaType javaType = mapper.getTypeFactory() .constructParametricType(ArrayList.class, valueType); //解决不能反序列化 mapper.configure( DeserializationConfig.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true); obj = mapper.readValue(json, javaType); // 把 json 对象转化为 java 对象 } catch (JsonGenerationException ex) { Logger.getLogger(JsonUtil.class.getName()).log(Level.SEVERE, null, ex); } catch (JsonMappingException ex) { Logger.getLogger(JsonUtil.class.getName()).log(Level.SEVERE, null, ex); } catch (IOException ex) { Logger.getLogger(JsonUtil.class.getName()).log(Level.SEVERE, null, ex); } return obj; } /** * 打印map */ @SuppressWarnings({ "rawtypes", "unchecked" }) public static void printMap(Map map) { Set<String> keySet = map.keySet(); for (String key : keySet) { System.out.println("key = " + key); Object obj = map.get(key); String className = obj.getClass().getName(); System.out.println("type =" + className); boolean isMap = className.toLowerCase().indexOf("map") >= 0; boolean isList = className.toLowerCase().indexOf("list") >= 0; if (isMap) { System.out.println("==== is map ===="); printMap((Map) obj); // 递归调用 } else if (isList) { List list = (List) obj; System.out.println("==== is list ==== , size = " + list.size()); for (Object oo : list) { System.out.println("element type =" + oo.getClass().getName()); System.out.println("element toString =" + oo.toString()); } } else { System.out.println("obj.toString = " + obj.toString()); } } } }
二十二、Arrays.asList() 的bug
常常使用Arrays.asLisvt()后调用add,remove这些method时出现java.lang.UnsupportedOperationException异常。这是由于:
Arrays.asList() 返回java.util.Arrays$ArrayList, 而不是ArrayList。Arrays$ArrayList和ArrayList都是继承AbstractList,remove,add等method在AbstractList中是默认throw UnsupportedOperationException而且不作任何操作。ArrayList override这些method来对list进行操作,但是Arrays$ArrayList没有override remove(int),add(int)等,所以throw UnsupportedOperationException。
解决方法是使用Iterator,或者转换为ArrayList
List list = Arrays.asList(a[]); List arrayList = new ArrayList(list);
相关推荐
"Java相关的四十个名字和十大事件"这个主题涵盖了Java发展历程中的关键人物和里程碑,这些都对Java的形成、发展和广泛应用产生了深远影响。 一、Java关键人物 1. James Gosling:Java之父,他在Sun Microsystems...
在数据分析和科学计算中,曲线拟合是一种常用的技术,用于找到一个数学模型来最好地匹配一组数据点。...这增加了代码的可移植性和使用场景,对于那些需要在Java环境中处理类似问题的人来说,是一个宝贵的资源。
二十四节气是中国传统历法的重要组成部分,它反映了地球在公转轨道上的位置变化,与农业生产、气候、民俗活动等紧密相关。以下是对这个话题的详细阐述: 首先,我们需要了解二十四节气的基本概念和计算原理。二十四...
【Java历史概述】 Java编程语言的发展历程始于1990年代初,由一群充满激情的Sun Microsystems工程师发起。最初,由于对现有C++工具的不满,Patrick Naughton提出要开发一个新的平台技术,这个项目最初被称为Stealth...
#### 四、解决Java中文问题的方法 针对上述原因,我们可以采取以下措施来解决Java中文乱码问题: 1. **统一编码格式**:确保开发环境中所有相关的编码设置都使用统一的标准,如UTF-8。这包括文件保存时的编码、...
【标题】:“英语四六级测试助手Java源代码”是一个专为英语四六级考试设计的辅助工具,其核心功能是通过编程实现考试过程中的时间提醒。这个项目非常适合Java初学者学习和参考,有助于理解Java编程语言在实际应用中...
JAVA面试问题总结 JAVA是一种广泛应用的编程语言,作为一名JAVA开发者,需要具备扎实的基础知识和实践经验。本文总结了常见的JAVA面试问题,涵盖了JAVA基础、JSP、Servlet、XML、J2EE、MVC、数据库等方面的知识点。...
对于开发者而言,这是一个学习和实践Java企业级应用开发的好材料,特别是对于报表生成和数据处理这部分内容,可以帮助他们快速掌握相关技术并应用于实际项目中。通过深入研究这个示例,开发者可以了解到如何在不同层...
Java绘制图片火焰效果,源代码相关注释:前景和背景Image对象、Applet和绘制火焰的效果的Image对象、Applet和绘制火焰的效果的Graphics对象、火焰效果的线程、Applet的高度,图片到图片装载器、绘制火焰效果的X坐标...
总的来说,这个四级查分系统展示了Java在实际应用中的强大能力,结合Swing构建GUI和JDBC处理数据库交互,提供了一种高效、可靠的方法来解决特定问题。对于学习Java的开发者来说,这是一个很好的实践项目,能够帮助...
Java相关课程系列笔记之十四Hibernate学习笔记(建议用WPS打开) Java相关课程系列笔记之十五Spring学习笔记(建议用WPS打开) Java相关课程系列笔记之十一Ajax学习笔记(建议用WPS打开) Java相关课程系列笔记之四...
14. **微软与Sun的Java之争**:1997年至2001年间,微软和Sun围绕Java技术的授权和兼容性问题展开激烈竞争,影响了Java的发展方向。 这些事件和名称构成了Java编程语言的历史,揭示了它如何从一个内部项目发展成为...
【北大青鸟ACCP5.0 Java第四章理论与上机作业答案解析】 北大青鸟ACCP5.0是针对初学者设计的一套完整的Java编程教程,尤其...在遇到困难时,可以参考相关教材、网络资源或向教师求助,确保对每个问题都有透彻的理解。
在此,我们将深入探讨Java在构建网上支付系统中的应用及其相关技术。 1. **支付网关集成**:Java源码中的支付网关模块是连接商家系统与银行系统的桥梁。支付网关通常需要实现各种支付协议,如银行卡组织的Direct...
《Java学习指南第四版下册》是一本专为Java初学者和进阶者设计的教程,旨在帮助读者全面深入地掌握Java编程语言的核心概念和技术。该书中文版的第四版下册涵盖了Java语言的高级特性,是理解Java编程精髓的重要资料。...
"Java发展历程" Java是一种广泛应用于互联网的编程语言,其发展历程可以追溯到1990年。该语言的诞生离不开Sun公司的工程师Patrick Naughton和James Gosling等人的努力。他们为了开发一种新的基础平台技术,启动了一...
实验报告的主题是“JAVA实验报告四数据库编程”,主要目的是让学生掌握基本的数据库管理系统(DBMS)使用、理解Java数据库连接(JDBC)的概念,并通过JDBC-ODBC桥接技术来开发实际的数据库系统。实验内容包括设计和...
Java 缺少字体问题及其解决方案 在开发或运行Java应用程序时,可能会遇到“缺少字体”这样的错误提示。这是因为Java虚拟机(JVM)在特定环境中找不到所需的字体来正确地渲染文本。这通常发生在某些Java应用需要显示...