package edu.ucsd.arcum.util; import static java.lang.String.valueOf; import java.util.Iterator; import java.util.List; import java.util.Map; import com.google.common.collect.Lists; public class StringUtil { public static <T> String enumerate(T[] args) { List<T> list = Lists.newArrayList((T[])args); return enumerate(list); } public static String enumerate(Iterable<?> args) { List<Object> elements = Lists.newArrayList(); for (Object arg : args) { elements.add(arg); } if (elements.size() == 1) { return elements.get(0).toString(); } else { StringBuilder builder = new StringBuilder(); for (int i = 0; i < elements.size(); ++i) { final int count = i + 1; builder.append(count); builder.append(") "); builder.append(elements.get(i)); if (i + 1 < elements.size()) { builder.append("; "); } } return builder.toString(); } } public static void separate(StringBuilder buff, Iterable<?> args, String separator) { Iterator<?> i = args.iterator(); if (i.hasNext()) { for (;;) { Object thing = i.next(); buff.append(thing.toString()); if (i.hasNext()) { buff.append(separator); } else break; } } } @Pure public static String separate(Iterable<?> args, String separator) { StringBuilder buff = new StringBuilder(); separate(buff, args, separator); return buff.toString(); } // EXAMPLE: Changed from "Collection" to "Iterable" (and down called methods, like // the other two static 'separate' methods): The iterable aspect of it was all // that was needed. @Pure public static String separate(Iterable<?> args) { return separate(args, ", "); } @Pure public static String separate(Map<?, ?> map) { StringBuilder buff = new StringBuilder(); for (Map.Entry<?, ?> entry : map.entrySet()) { buff.append(String.format(" --%s = %s%n", entry.getKey(), entry.getValue())); } return buff.toString(); } @Pure public static String extractString(char[] cs, int start, int length) { StringBuilder buff = new StringBuilder(); buff.append(cs, start, length); return buff.toString(); } @Pure public static String stripWhitespace(String str) { StringBuilder buff = new StringBuilder(); int len = str.length(); for (int i = 0; i < len; ++i) { char c = str.charAt(i); if (!Character.isWhitespace(c)) { buff.append(c); } } return buff.toString(); } public static Object minimizeWhitespace(Object o) { return minimizeWhitespace(String.valueOf(o)); } @Pure public static String minimizeWhitespace(String str) { str = str.trim(); StringBuilder buff = new StringBuilder(); int len = str.length(); boolean lastWasNonWhite = true; for (int i = 0; i < len; ++i) { char c = str.charAt(i); if (Character.isWhitespace(c)) { if (lastWasNonWhite) { lastWasNonWhite = false; buff.append(' '); } } else { lastWasNonWhite = true; buff.append(c); } } return buff.toString(); } @Pure public static String valueOfAndClass(Object obj) { return String.format("%s [%s]", valueOf(obj), (obj == null) ? "null" : obj .getClass().getName()); } public static String debugDisplay(Object obj) { if (obj == null) { return "null"; } else { String clazzName = obj.getClass().getSimpleName(); int id = System.identityHashCode(obj); return String.format("%s [%s:%x]", minimizeWhitespace(obj), clazzName, id); } } @Pure public static String firstLine(String string) { int i = string.indexOf(String.format("%n")); if (i == -1) i = string.indexOf("\n"); if (i == -1) return string; else return string.substring(0, i); } // Returns a string with backslashes inserted so that the given string can be // a string literal public static String escape(String text) { // MACNEIL: Just return the text for now: exact output isn't important now return text; } }