【Java】用JDK1.5之后的新型数组遍历方法遍历HashMap、HashMap不应该存储多元组

在JDK1.5就多了一种for循环的遍历写法,现在应该没有人用JDK1.4了吧?我见那些2005年出的JAVA书,谭浩强系列的JAVA书都是使用JDK1.5了,当然JDK1.7已经使用的,据说JDK1.7是兼容JDK1.2~JDK1.7,现在的JAVA编程都是基于JDK1.5的。然而由于考试不要求或者其它什么原因,它并不受程序猿的青睐,而在平常实践用,旧式的循环中用多了,老程序猿依旧作为开发主力的情况,也就没有人敢于尝试这种新型的数组遍历方法了,其实这种方法在遍历HashMap的时候尤其有用,能够写少很多代码,思路也清晰。有点类似php中的foreach的方法。

一、JDK1.5之后的新型数组遍历方法是什么?

我们拿一道最简单的题目来做例子,定义一个数组,求里面元素之和、求里面的最大(小)值。

这个学过Java的人必须会,是必修课,一般这样写:

public class Arrtest {
	public static void main(String[] args) {
		int[] arr = { 1, 12, 32, 13, 23, 24, 21, 4, 214, 21, 5, 12 };
		int arrtotal = 0;
		int max = arr[0];
		for (int i = 0; i < arr.length; i++) {
			int element = arr[i];
			arrtotal += element;
			if (max < element) {
				max = element;
			}
		}
	}
}

实验结果如下:


但其实使用JDK1.5之后的新型数组遍历方法完全可以这样写:

public class Arrtest {
	public static void main(String[] args) {
		int[] arr = { 1, 12, 32, 13, 23, 24, 21, 4, 214, 21, 5, 12 };
		int arrtotal = 0;
		int max = arr[0];
		for (int element : arr) {
			arrtotal += element;
			if (max < element) {
				max = element;
			}
		}
		System.out.printf(Arrays.toString(arr));
		System.out.print("\n数组中所有元素之和为:" + arrtotal + "\n");
		System.out.println("数组中的最大值为:" + max);
	}
}

实验结果与上面一样,

其中关键的变化在于for循环里面的条件,它的意思是把arr中的第i的元素定义为element,其中i是0到arr.length,自动自增

这样可以避免了i变量的定义,然后又写一个i的自增,其实for循环是while循环的改进,当年常常在while循环外面定义一个i,再于while里面自增,for则一个括号则OK,现在这种新型的for循环的出现的,让这个i也隐藏掉了。这在一些诸如现在求最大值、求数组内各个元素之和等i不用重要情况下很有用,但是并不是说这种新型for循环就能够取代for了,毕竟一旦i变得重要起来,例如:求出数组中最大值的位置,冒泡排序要操作第i个元素的前后元素等,这种foreach循环就完蛋了。

同时,请看我上面的代码,foreach在遍历输出整个数组,并不好用,毕竟每个元素之后的" "或者","无法消去,例如,利用foreach输出数组中的元素,永远是1, 12, 32, 13, 23, 24, 21, 4, 214, 21, 5, 12,或者1  12  32  13  23  24  21  4  214  21  5  12  ,最后一个元素始终存在一个,或者空格,输出很不好看,还不如用我在《【Java】Arrays中之于int数组的方法,Integer数组与int数组》(点击打开链接)提出的方法,用System.out.print(Arrays.toString(arr));输出一个数组实在。


二、如何遍历HashMap?

输出一个HashMap还好,直接就可以用System.out.println(HashMap);进行输出,但是,要你对HashMap中每一个key并且把每一个key所对应的元素进行处理,这就头大了。封装方法用多了,让你处理里面的深入的东西,就呵呵了,现在框架什么的盛行,都这样。

其实完全可以利用这个foreach来遍历HashMap,方法如下:

import java.util.*;

public class HashmapTraversal {
	public static void main(String[] args) {
		HashMap<String, String> string_map = new HashMap<String, String>();
		string_map.put("key1", "value1");
		string_map.put("key2", "value3");
		string_map.put("key121", "value3211");
		string_map.put("key31", "value12");
		string_map.put("key41", "value10");
		for (String key : string_map.keySet()) {
			System.out.println("KEY:" + key + "对应的值为:" + string_map.get(key));
		}
	}
}

先定义一个HashMap,在里面放入5个元素,再用string_map.keySet()取出这个string_map的Key集合,对这个string_map的Key集合进行foreach遍历,设key是string_map的Key集合里面的第i个元素,再利用get方法拿出里面的集就可以了。实验结果如下:


至于那些HashMap<String, ArrayList<Integer,String>>怎么办?这本来就不是一个好的存储要处理数据的方法,我在《【Java】Java中的Collections类——Java中升级版的数据结构》(点击打开链接)里面提过,这方法本来就是错误的,既然你要存储一个三元组,为何不定义个类,例如:

class Tuple{
	public String key;
	public int integer;
	public String string;
}
然后在定义一个存放这个多元组Tuple类的动态数组ArrayList呢,非要把整个HashMap弄得复杂起来?

例如:

ArrayList<Tuple> tuple_arraylist=new ArrayList<Tuple>();

C语言姑且会定义结构体,然后来到Java中就死扣HashMap,这实在是不明智!

你可能感兴趣的:(java,遍历,HashMap,foreach,存储)