65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.21/5 (5投票s)

2004年4月8日

CPOL

3分钟阅读

viewsIcon

103695

呈现一种将数组内容以泛型方式转换为字符串的方法。

引言

在本文中,我希望开始一系列讨论 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 日:首次发布
© . All rights reserved.