`

java 相关问题(四)

    博客分类:
  • java
 
阅读更多

十九、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的形成、发展和广泛应用产生了深远影响。 一、Java关键人物 1. James Gosling:Java之父,他在Sun Microsystems...

    Java实现四参数Logistic曲线拟合代码.zip

    在数据分析和科学计算中,曲线拟合是一种常用的技术,用于找到一个数学模型来最好地匹配一组数据点。...这增加了代码的可移植性和使用场景,对于那些需要在Java环境中处理类似问题的人来说,是一个宝贵的资源。

    java实现二十四节气计算

    二十四节气是中国传统历法的重要组成部分,它反映了地球在公转轨道上的位置变化,与农业生产、气候、民俗活动等紧密相关。以下是对这个话题的详细阐述: 首先,我们需要了解二十四节气的基本概念和计算原理。二十四...

    与Java相关的四十个名字

    【Java历史概述】 Java编程语言的发展历程始于1990年代初,由一群充满激情的Sun Microsystems工程师发起。最初,由于对现有C++工具的不满,Patrick Naughton提出要开发一个新的平台技术,这个项目最初被称为Stealth...

    java中文乱码问题详解--- java中文乱码问题详解

    #### 四、解决Java中文问题的方法 针对上述原因,我们可以采取以下措施来解决Java中文乱码问题: 1. **统一编码格式**:确保开发环境中所有相关的编码设置都使用统一的标准,如UTF-8。这包括文件保存时的编码、...

    英语四六级测试助手Java源代码

    【标题】:“英语四六级测试助手Java源代码”是一个专为英语四六级考试设计的辅助工具,其核心功能是通过编程实现考试过程中的时间提醒。这个项目非常适合Java初学者学习和参考,有助于理解Java编程语言在实际应用中...

    JAVA面试问题,自己和别人总结

    JAVA面试问题总结 JAVA是一种广泛应用的编程语言,作为一名JAVA开发者,需要具备扎实的基础知识和实践经验。本文总结了常见的JAVA面试问题,涵盖了JAVA基础、JSP、Servlet、XML、J2EE、MVC、数据库等方面的知识点。...

    java四层架构报表的生成

    对于开发者而言,这是一个学习和实践Java企业级应用开发的好材料,特别是对于报表生成和数据处理这部分内容,可以帮助他们快速掌握相关技术并应用于实际项目中。通过深入研究这个示例,开发者可以了解到如何在不同层...

    java源码包---java 源码 大量 实例

     Java绘制图片火焰效果,源代码相关注释:前景和背景Image对象、Applet和绘制火焰的效果的Image对象、Applet和绘制火焰的效果的Graphics对象、火焰效果的线程、Applet的高度,图片到图片装载器、绘制火焰效果的X坐标...

    用java编写的四级查分系统

    总的来说,这个四级查分系统展示了Java在实际应用中的强大能力,结合Swing构建GUI和JDBC处理数据库交互,提供了一种高效、可靠的方法来解决特定问题。对于学习Java的开发者来说,这是一个很好的实践项目,能够帮助...

    Java相关课程系列笔记

    Java相关课程系列笔记之十四Hibernate学习笔记(建议用WPS打开) Java相关课程系列笔记之十五Spring学习笔记(建议用WPS打开) Java相关课程系列笔记之十一Ajax学习笔记(建议用WPS打开) Java相关课程系列笔记之四...

    十大事件与Java相关的四十个名字

    14. **微软与Sun的Java之争**:1997年至2001年间,微软和Sun围绕Java技术的授权和兼容性问题展开激烈竞争,影响了Java的发展方向。 这些事件和名称构成了Java编程语言的历史,揭示了它如何从一个内部项目发展成为...

    北大青鸟accp5.0java第四章理论加上机作业答案

    【北大青鸟ACCP5.0 Java第四章理论与上机作业答案解析】 北大青鸟ACCP5.0是针对初学者设计的一套完整的Java编程教程,尤其...在遇到困难时,可以参考相关教材、网络资源或向教师求助,确保对每个问题都有透彻的理解。

    java 网上支付源码

    在此,我们将深入探讨Java在构建网上支付系统中的应用及其相关技术。 1. **支付网关集成**:Java源码中的支付网关模块是连接商家系统与银行系统的桥梁。支付网关通常需要实现各种支付协议,如银行卡组织的Direct...

    Java学习指南第四版下册

    《Java学习指南第四版下册》是一本专为Java初学者和进阶者设计的教程,旨在帮助读者全面深入地掌握Java编程语言的核心概念和技术。该书中文版的第四版下册涵盖了Java语言的高级特性,是理解Java编程精髓的重要资料。...

    与Java相关的四十个响亮的名字

    "Java发展历程" Java是一种广泛应用于互联网的编程语言,其发展历程可以追溯到1990年。该语言的诞生离不开Sun公司的工程师Patrick Naughton和James Gosling等人的努力。他们为了开发一种新的基础平台技术,启动了一...

    JAVA实验报告四数据库编程.docx

    实验报告的主题是“JAVA实验报告四数据库编程”,主要目的是让学生掌握基本的数据库管理系统(DBMS)使用、理解Java数据库连接(JDBC)的概念,并通过JDBC-ODBC桥接技术来开发实际的数据库系统。实验内容包括设计和...

    java缺少字体问题增加相关的安装文件

    Java 缺少字体问题及其解决方案 在开发或运行Java应用程序时,可能会遇到“缺少字体”这样的错误提示。这是因为Java虚拟机(JVM)在特定环境中找不到所需的字体来正确地渲染文本。这通常发生在某些Java应用需要显示...

Global site tag (gtag.js) - Google Analytics