Java 泛型代码 - 以泛型方式将数组内容转换为字符串






3.21/5 (5投票s)
呈现一种将数组内容以泛型方式转换为字符串的方法。
引言
在本文中,我希望开始一系列讨论 Java 泛型代码的文章。 我将从一个容易解决,但却在与我的同事的许多代码会话中反复出现的问题开始。 ;)
Java 泛型代码 - 以泛型方式将数组内容转换为字符串
想象一下你有以下代码
public static void main(String[] args) {
Object[] arrayList = {
new int[] {0, 1, 2 ,3},
new double[] {0.1d, 1.0d, 3.2d ,3.5d},
new java.awt.Color[] {java.awt.Color.BLACK, java.awt.Color.WHITE},
new boolean[] {true, false, true, true, false, false}
};
for (int i = 0; i < arrayList.length; i++) {
System.out.println("Array[" + (i + 1) + "] = " + arrayToString(arrayList[i]));
}
}
并且不知何故(由于 arrayToString()
方法的“奇迹”),输出看起来像这样
Array[1] = [0, 1, 2, 3]
Array[2] = [0.1, 1.0, 3.2, 3.5]
Array[3] = [java.awt.Color[r=0,g=0,b=0], java.awt.Color[r=255,g=255,b=255]]
Array[4] = [true, false, true, true, false, false]
您会对这样的方法感到满意,因为这意味着您现在可以轻松地获取任何 Java Array
对象的内容,并使用一个简单的方法将其格式化为 String
,而不是重复编写代码来迭代 Array
并单独处理每个项目。
为什么这实际上很重要
这听起来可能是一个微不足道的问题,但我想强调的是,许多团队合作的程序员会尝试编写自己的代码来解决这个问题。 让许多组件执行相同的功能是一种浪费,并且要警告的是,虽然一些程序员会做对并且在解决这个问题时不会有任何错误,但其他程序员可能会意外地编写一个显示 Array
内容的方法,并存在错误! 我实际上浪费了 20 分钟,和另一位程序员一起,因为他的调试代码没有显示 Array
对象中的最后一个项目,导致我们认为最后一个项目实际上从未正确发送。
不好笑! :(
继续表演
JDK 中不存在这样的方法,但它非常简短易懂; 检查以下代码
1 public static String arrayToString(Object array) {
2 if (array == null) {
3 return "[NULL]";
4 } else {
5 Object obj = null;
6 if (array instanceof Hashtable) {
7 array = ((Hashtable)array).entrySet().toArray();
8 } else if (array instanceof HashSet) {
9 array = ((HashSet)array).toArray();
10 } else if (array instanceof Collection) {
11 array = ((Collection)array).toArray();
12 }
13 int length = Array.getLength(array);
14 int lastItem = length - 1;
15 StringBuffer sb = new StringBuffer("[");
16 for (int i = 0; i < length; i++) {
17 obj = Array.get(array, i);
18 if (obj != null) {
19 sb.append(obj);
20 } else {
21 sb.append("[NULL]");
22 }
23 if (i < lastItem) {
24 sb.append(", ");
25 }
26 }
27 sb.append("]");
28 return sb.toString();
29 }
30 }
让我们详细检查代码。
第 2-4 行
首先,我们检查传递给我们的 array
是否为 null
,如果是,则第 2-3 行将返回“[NULL]
”,我们就完成了!
第 5-12 行
如果 array
不是 null
,那么第 6-12 行确保如果 - 出于错误? - 我们收到一个 Hashtable
/HashSet
/Collection
对象,它将被正确转换为 array
对象给我们!
第 13 行
这里我们使用 Java 的 Array
类来泛型地检索相关数组的长度; 当然,这是需要的,因为如果你还记得,我们收到 array
作为 Object
,而不是作为任何 Java 本机类型的适当 Array
。
第 14-16 行
计算最后一个项目的索引; 创建一个 StringBuffer
来收集文本输出; 启动一个 for
循环来遍历数组中的所有项目。
第 17 行
再次,我们使用 Java 的 Array
类来泛型地检索当前索引的项目。
第 18-26 行
给定 array
中当前索引的项目,我们要么添加该项目的内容 - 如其 toString()
方法所表达的那样 - 并将其添加到 StringBuffer
,或者如果当前项目为 null
,我们将 “[NULL]
” 添加到 StringBuffer
以显示此槽中没有任何内容。 在第 23 行,我们检查该项目是否是最后一个项目,如果不是,第 24 行将添加一个逗号和一个空格,以便我们可以继续正确构建文本输出。
第 27-30 行
现在,我们将一个“]
”字符附加到 StringBuffer
的末尾,并将整个文本从 StringBuffer
返回到我们的调用方法。
我希望这个小方法会有所帮助,我知道当我必须调试有很多不同类型的 Array
对象的代码时,我发现它非常有用,这些对象都要被打印出来,格式化为 Java 异常和其他需要 Array
的内容可以轻松转换为文本 String
的有趣的东西。
享受。
历史
- 2004 年 4 月 7 日:首次发布