null
if the string
* is null
, else it will be a non-empty list of strings. If
* delim is null
or is not found in the string, the
* list will contain one element: the original string.
*
* This isn't the same thing as using a tokenizer. delim is a
* literal string, not a set of characters any of which may be a delimiter.
*
* @param str
* the string we're splitting
* @param delim
* the delimter string
*/
public static List split(String str, String delim) {
if (str == null)
return null;
ArrayList list = new ArrayList();
if (delim == null) {
list.add(str);
return list;
}
int subStart, afterDelim = 0;
int delimLength = delim.length();
while ((subStart = str.indexOf(delim, afterDelim)) != -1) {
list.add(str.substring(afterDelim, subStart));
afterDelim = subStart + delimLength;
}
if (afterDelim <= str.length())
list.add(str.substring(afterDelim));
return list;
}
/**
* Returns a string consisting of all members of a collection separated by the
* specified string. The toString
method of each collection
* member is called to convert it to a string.
*
* @param c
* a collection of objects
* @param joinWith
* the string that will separate each member of the collection
*/
public static String join(Collection c, String joinWith) {
if (c == null)
return "";
StringBuffer buf = new StringBuffer();
boolean first = true;
for (Iterator iter = c.iterator(); iter.hasNext();) {
if (first)
first = false;
else if (joinWith != null)
buf.append(joinWith);
buf.append(iter.next().toString());
}
return buf.toString();
}
/**
* Returns an array of strings, one for each line in the string. Lines end
* with any of cr, lf, or cr lf. A line ending at the end of the string will
* not output a further, empty string.
*
* This code assumes str is not null
.
*
* @param str
* the string to split
* @return a non-empty list of strings
*/
public static List splitIntoLines(String str) {
ArrayList strings = new ArrayList();
int len = str.length();
if (len == 0) {
strings.add("");
return strings;
}
int lineStart = 0;
for (int i = 0; i < len; ++i) {
char c = str.charAt(i);
if (c == '\r') {
int newlineLength = 1;
if ((i + 1) < len && str.charAt(i + 1) == '\n')
newlineLength = 2;
strings.add(str.substring(lineStart, i));
lineStart = i + newlineLength;
if (newlineLength == 2) // skip \n next time through loop
++i;
} else if (c == '\n') {
strings.add(str.substring(lineStart, i));
lineStart = i + 1;
}
}
if (lineStart < len)
strings.add(str.substring(lineStart));
return strings;
}
/**
* Appends a string to a string buffer, adding extra newlines so the message
* is not too wide. Max width is not guaranteed; if there is no space in a
* line before DEFAULT_MAX_MESSAGE_WIDTH
then the next one
* after it will be used insetead. Each line will be trimmed before and after
* it's added, so some whitespace may be goofed up. This is used for error
* message wrapping, so it's not critical that whitespace be preserved.
*
* TODO Looks for space, not all whitespace. This should probably change. * * @param buf * the string buffer * @param str * the string */ public static void splitUp(StringBuffer buf, String str) { splitUp(buf, str, DEFAULT_MAX_MESSAGE_WIDTH); } /** * Appends a string to a string buffer, adding extra newlines so the message * is not too wide. Max width is not guaranteed; if there is no space in a * line before maxWidth then the next one after it will be used * instead. Each line will be trimmed before and after it's added, so some * whitespace may be goofed up. This is used for error message wrapping, so * it's not critical that whitespace be preserved. *
* TODO Looks for space, not all whitespace. This should probably change. * * @param buf * the string buffer * @param str * the string * @param maxWidth * maximum number of chars in each line */ public static void splitUp(StringBuffer buf, String str, int maxWidth) { if (str == null) return; str = str.trim(); while (str.length() >= maxWidth) { int pos = str.lastIndexOf(' ', maxWidth); if (pos == -1) { // No spaces before; look for first one after pos = str.indexOf(' ', maxWidth); if (pos == -1) break; } buf.append(str.substring(0, pos).trim()); buf.append("\n"); str = str.substring(pos + 1).trim(); } buf.append(str); } }