`

java实现数据结构打印

阅读更多

   在程序中log信息可以跟踪程序的执行情况,大多时候我们需要将一个pojo或list中的信息打印出来,这样可以检查信息是否是我们所需要的,通常情况下这个就是需要遍历了,效率不高且不通用,以下为一个通用的结构打印的代码,以供参考。

import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.AbstractMap;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class TypeUtil {

	/**
	 * Returns a string holding the contents of the passed object,
	 * 
	 * @param scope
	 *            String
	 * @param parentObject
	 *            Object
	 * @param visitedObjs
	 *            List
	 * @return String
	 */

	private static String complexTypeToString(String scope, Object parentObject, List visitedObjs) {

		StringBuffer buffer = new StringBuffer("");

		try {
			//
			// Ok, now we need to reflect into the object and add its child
			// nodes...
			//

			Class cl = parentObject.getClass();
			while (cl != null) {

				processFields(cl.getDeclaredFields(), scope, parentObject, buffer, visitedObjs);

				cl = cl.getSuperclass();
			}
		} catch (IllegalAccessException iae) {
			buffer.append(iae.toString());
		}

		return (buffer.toString());
	}

	/**
	 * Method processFields
	 * 
	 * @param fields
	 *            Field[]
	 * @param scope
	 *            String
	 * @param parentObject
	 *            Object
	 * @param buffer
	 *            StringBuffer
	 * @param visitedObjs
	 *            List
	 * @throws IllegalAccessException
	 */
	private static void processFields(Field[] fields, String scope, Object parentObject, StringBuffer buffer, List visitedObjs) throws IllegalAccessException {

		for (int i = 0; i < fields.length; i++) {

			//
			// Disregard certain fields for IDL structures
			//
			//			if (fields[i].getName().equals("__discriminator")
			//				|| fields[i].getName().equals("__uninitialized")) {
			//				continue;
			//			}

			//
			// This allows us to see non-public fields. We might need to deal
			// with some
			// SecurityManager issues here once it is outside of VAJ...
			//
			fields[i].setAccessible(true);

			if (Modifier.isStatic(fields[i].getModifiers())) {
				//
				// Ignore all static members. The classes that this dehydrator
				// is
				// meant to handle are simple data objects, so static members
				// have no
				// bearing....
				//
			} else {
				buffer.append(typeToString(scope + "." + fields[i].getName(), fields[i].get(parentObject), visitedObjs));
			}
		}

	}

	/**
	 * Method isCollectionType
	 * 
	 * @param obj
	 *            Object
	 * @return boolean
	 */
	public static boolean isCollectionType(Object obj) {

		return (obj.getClass().isArray() || (obj instanceof Collection) || (obj instanceof Hashtable) || (obj instanceof HashMap) || (obj instanceof HashSet)
				|| (obj instanceof List) || (obj instanceof AbstractMap));
	}

	/**
	 * Method isComplexType
	 * 
	 * @param obj
	 *            Object
	 * @return boolean
	 */
	public static boolean isComplexType(Object obj) {

		if (obj instanceof Boolean || obj instanceof Short || obj instanceof Byte || obj instanceof Integer || obj instanceof Long || obj instanceof Float
				|| obj instanceof Character || obj instanceof Double || obj instanceof String) {

			return false;
		} else {

			Class objectClass = obj.getClass();

			if (objectClass == boolean.class || objectClass == Boolean.class || objectClass == short.class || objectClass == Short.class || objectClass == byte.class
					|| objectClass == Byte.class || objectClass == int.class || objectClass == Integer.class || objectClass == long.class || objectClass == Long.class
					|| objectClass == float.class || objectClass == Float.class || objectClass == char.class || objectClass == Character.class || objectClass == double.class
					|| objectClass == Double.class || objectClass == String.class) {

				return false;

			}

			else {
				return true;
			}
		}
	}

	/**
	 * Returns a string holding the contents of the passed object,
	 * 
	 * @param scope
	 *            String
	 * @param obj
	 *            Object
	 * @param visitedObjs
	 *            List
	 * @return String
	 */

	private static String collectionTypeToString(String scope, Object obj, List visitedObjs) {

		StringBuffer buffer = new StringBuffer("");

		if (obj.getClass().isArray()) {
			if (Array.getLength(obj) > 0) {

				for (int j = 0; j < Array.getLength(obj); j++) {

					Object x = Array.get(obj, j);

					buffer.append(typeToString(scope + "[" + j + "]", x, visitedObjs));
				}

			} else {
				buffer.append(scope + "[]: empty\n");
			}
		} else {
			boolean isCollection = (obj instanceof Collection);
			boolean isHashTable = (obj instanceof Hashtable);
			boolean isHashMap = (obj instanceof HashMap);
			boolean isHashSet = (obj instanceof HashSet);
			boolean isAbstractMap = (obj instanceof AbstractMap);
			boolean isMap = isAbstractMap || isHashMap || isHashTable;

			if (isMap) {
				Set keySet = ((Map) obj).keySet();
				Iterator iterator = keySet.iterator();
				int size = keySet.size();

				if (size > 0) {

					for (int j = 0; iterator.hasNext(); j++) {

						Object key = iterator.next();
						Object x = ((Map) obj).get(key);

						buffer.append(typeToString(scope + "[\"" + key + "\"]", x, visitedObjs));
					}
				} else {
					buffer.append(scope + "[]: empty\n");
				}
			} else if (/* isHashTable || */
			isCollection || isHashSet /* || isHashMap */
			) {

				Iterator iterator = null;
				int size = 0;

				if (obj != null) {

					if (isCollection) {
						iterator = ((Collection) obj).iterator();
						size = ((Collection) obj).size();
					} else if (isHashTable) {
						iterator = ((Hashtable) obj).values().iterator();
						size = ((Hashtable) obj).size();
					} else if (isHashSet) {
						iterator = ((HashSet) obj).iterator();
						size = ((HashSet) obj).size();
					} else if (isHashMap) {
						iterator = ((HashMap) obj).values().iterator();
						size = ((HashMap) obj).size();
					}

					if (size > 0) {

						for (int j = 0; iterator.hasNext(); j++) {

							Object x = iterator.next();
							buffer.append(typeToString(scope + "[" + j + "]", x, visitedObjs));
						}
					} else {
						buffer.append(scope + "[]: empty\n");
					}
				} else {
					//
					// theObject is null
					buffer.append(scope + "[]: null\n");
				}
			}
		}

		return (buffer.toString());

	}

	/**
	 * Method typeToString
	 * 
	 * @param scope
	 *            String
	 * @param obj
	 *            Object
	 * @param visitedObjs
	 *            List
	 * @return String
	 */
	private static String typeToString(String scope, Object obj, List visitedObjs) {

		if (obj == null) {
			return (scope + ": null\n");
		} else if (isCollectionType(obj)) {
			return collectionTypeToString(scope, obj, visitedObjs);
		} else if (isComplexType(obj)) {
			if (!visitedObjs.contains(obj)) {
				visitedObjs.add(obj);
				return complexTypeToString(scope, obj, visitedObjs);
			} else {
				return (scope + ": <already visited>\n");
			}
		} else {
			return (scope + ": " + obj.toString() + "\n");
		}
	}

	/**
	 * The typeToString() method is used to dump the contents of a passed object
	 * of any type (or collection) to a String. This can be very useful for
	 * debugging code that manipulates complex structures, such as the
	 * Middleware BIS EJBs.
	 * 
	 * @param scope
	 * @param obj
	 * 
	 * @return String
	 *  
	 */

	public static String typeToString(String scope, Object obj) {

		if (obj == null) {
			return (scope + ": null\n");
		} else if (isCollectionType(obj)) {
			return collectionTypeToString(scope, obj, new ArrayList());
		} else if (isComplexType(obj)) {
			return complexTypeToString(scope, obj, new ArrayList());
		} else {
			return (scope + ": " + obj.toString() + "\n");
		}
	}

	public static String checkValue(String s) {
		if (s == null)
			return "";
		if (s.startsWith("$")) {
			s = "";
		}
		return s;
	}

	public static boolean stringIsEmpty(String input) {
		if (input != null && !input.trim().equalsIgnoreCase("")) {
			return false;
		}
		return true;
	}
	
	
}

 使用方法很简单:比如要打印User这个对象的内容:

java 代码
TypeUtil.typeToString("User:",user);

 

分享到:
评论

相关推荐

    java实现word预览打印

    在IT行业中,尤其是在文档处理领域,Java是一种广泛使用的编程语言,可以实现各种复杂的功能,如动态生成模板Word文件,将其转换为PDF,并进行预览打印。以下是对标题、描述和标签所涉及知识点的详细说明: 1. **...

    用Java实现数据结构中的队列

    本篇文章将深入探讨如何用Java语言来实现这种基本的数据结构。 1. **队列的基本操作** - **enqueue()**: 将元素添加到队列的尾部。这是队列的插入操作。 - **dequeue()**: 移除并返回队列的头部元素。这是队列的...

    常见数据结构的Java实现

    在Java编程中,数据结构是组织、存储和处理数据的核心工具。常见的数据结构有数组、链表、栈、队列、树等。本篇将详细讨论两个Java代码示例,它们涉及到了链表这一重要的数据结构及其操作。 例子1: 在这个例子中,...

    Java数据结构题

    本主题主要关注Java语言实现的数据结构及其相关算法,这对于提升程序性能和解决复杂问题至关重要。下面将详细讨论几个关键的数据结构及其应用。 1. 数组:数组是最基本的数据结构,它是一系列相同类型元素的集合,...

    数据结构java版

    9. **排序算法**:在Java中实现的各种排序算法,如冒泡排序、选择排序、插入排序、快速排序、归并排序和堆排序,都是基于特定数据结构的优化操作。 10. **搜索算法**:深度优先搜索(DFS)和广度优先搜索(BFS)是...

    java实现打印.rar

    这个"java实现打印.rar"压缩包包含了一些示例代码,旨在帮助开发者理解如何在Java中实现打印功能。以下是对这些示例文件及其可能涉及的知识点的详细解释: 1. **IwbFrameEmployee.java**: 这个文件很可能包含一个...

    数据结构java在控制台实现二叉树的打印

    数据结构java在控制台实现二叉树的打印

    数据结构(JAVA版)教学课件

    数据结构是计算机科学中的核心课程,它探讨了...通过这些章节的学习,读者将对数据结构有深入的理解,并能熟练运用JAVA实现各种数据结构和算法。无论是进行软件开发还是解决复杂问题,扎实的数据结构基础都至关重要。

    java版数据结构的 算术表达式与二叉树源码

    Java作为一种流行的编程语言,被广泛用于实现各种数据结构,包括二叉树。本篇将详细讲解基于Java的算术表达式与二叉树相关的知识点。 一、算术表达式与二叉树 1. **中缀表达式**:我们日常接触的算术表达式通常是...

    数据结构与算法Java语言描述 部分代码实现

    本资源提供了"数据结构与算法Java语言描述 第二版 部分代码实现",这意味着你将能够学习到如何使用Java来实现各种数据结构和算法。 1. **数组**:数组是最基本的数据结构,它允许存储固定大小的同类型元素集合。在...

    DICOM医学图像数据接口的Java实现

    这个标准定义了数据结构、通信协议和文件格式,使得不同厂商的医疗设备和软件能够共享医学图像数据。在Java中实现DICOM接口,可以让我们构建跨平台的医学图像处理应用。 在Java中实现DICOM接口,首先需要理解DICOM...

    Java Jsp 调用ireport动态模板打印

    Java JSP调用iReport动态模板打印是一种在Web应用程序中实现报表打印的常见技术。iReport是一款开源的报表设计工具,它可以与Java、JSP、Servlets等进行集成,为开发者提供灵活的报表生成和打印功能。在这个场景下,...

    Java数据结构与算法

    4. **队列**:队列是一种先进先出(FIFO)的数据结构,适用于任务调度、打印队列等。Java的`java.util.Queue`接口提供了队列操作。 5. **哈希表**:哈希表,如Java的`java.util.HashMap`,通过哈希函数将键映射到...

    数据结构(Java语言描述) 案例06 舞伴配对问题.docx

    链式队列的数据结构在Java中通常由LinkedList类实现,它提供了enqueue(入队)和dequeue(出队)等操作,方便我们进行元素的添加和移除。 算法的核心是`match`方法,它接受两个队列Q1和Q2以及一个表示配对轮次的...

    Java开发的发票打印

    Java的`JasperReports`库提供了强大的报表设计和数据绑定功能,适合处理复杂的发票结构。 7. **错误处理和调试**:在开发过程中,确保打印程序能够处理各种异常情况,如打印机未连接、纸张不足等问题。同时,利用...

    java数据结构(Java版)(第3版)[叶核亚] 全套资料

    Java中的PriorityQueue类实现了优先队列,基于堆数据结构实现。 十一、递归与分治策略 递归是解决问题的一种有效方法,常常用于树和图的遍历。分治策略将大问题分解为小问题,如快速排序和归并排序就是分治法的典型...

    (java)数据结构知识整理.pdf

    本文档主要围绕Java语言中数据结构的基础知识进行了整理,涉及算法的基本概念、特性、设计要求、时间复杂度,以及线性表的顺序存储结构和Java实现。 首先,算法被定义为解决特定问题的一系列操作指令的有限序列。一...

    java实现数据结构二叉树.doc

    总的来说,这个程序展示了如何在Java中实现一个满二叉树的构建和层序遍历,利用了数据结构和控制流程的知识,同时也体现了面向对象编程的思想。用户交互和错误处理使得程序更易用,而算法设计则确保了正确地遍历...

Global site tag (gtag.js) - Google Analytics