001 package biweekly.util; 002 003 import java.util.Collection; 004 import java.util.Map; 005 006 /* 007 Copyright (c) 2013, Michael Angstadt 008 All rights reserved. 009 010 Redistribution and use in source and binary forms, with or without 011 modification, are permitted provided that the following conditions are met: 012 013 1. Redistributions of source code must retain the above copyright notice, this 014 list of conditions and the following disclaimer. 015 2. Redistributions in binary form must reproduce the above copyright notice, 016 this list of conditions and the following disclaimer in the documentation 017 and/or other materials provided with the distribution. 018 019 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 020 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 021 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 022 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 023 ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 024 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 025 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 026 ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 027 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 028 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 029 */ 030 031 /** 032 * Contains miscellaneous string utilities. 033 * @author Michael Angstadt 034 */ 035 public class StringUtils { 036 /** 037 * Joins a collection of strings into a delimited list. 038 * @param collection the collection of strings 039 * @param delimiter the delimiter (e.g. ",") 040 * @return the final string 041 */ 042 public static String join(Collection<String> collection, String delimiter) { 043 return join(collection, delimiter, new JoinCallback<String>() { 044 public void handle(StringBuilder sb, String string) { 045 sb.append(string); 046 } 047 }); 048 } 049 050 /** 051 * Joins a collection of values into a delimited list. 052 * @param collection the collection of values 053 * @param delimiter the delimiter (e.g. ",") 054 * @param join callback function to call on every element in the collection 055 * @return the final string 056 */ 057 public static <T> String join(Collection<T> collection, String delimiter, JoinCallback<T> join) { 058 StringBuilder sb = new StringBuilder(); 059 060 boolean first = true; 061 for (T element : collection) { 062 if (first) { 063 first = false; 064 } else { 065 sb.append(delimiter); 066 } 067 join.handle(sb, element); 068 } 069 070 return sb.toString(); 071 } 072 073 /** 074 * Joins a map into a delimited list. 075 * @param map the map 076 * @param delimiter the delimiter (e.g. ",") 077 * @param join callback function to call on every element in the collection 078 * @return the final string 079 */ 080 public static <K, V> String join(Map<K, V> map, String delimiter, final JoinMapCallback<K, V> join) { 081 return join(map.entrySet(), delimiter, new JoinCallback<Map.Entry<K, V>>() { 082 public void handle(StringBuilder sb, Map.Entry<K, V> entry) { 083 join.handle(sb, entry.getKey(), entry.getValue()); 084 } 085 }); 086 } 087 088 /** 089 * Callback interface used with the 090 * {@link StringUtils#join(Collection, String, JoinCallback)} method. 091 * @author Michael Angstadt 092 * @param <T> the value type 093 */ 094 public static interface JoinCallback<T> { 095 void handle(StringBuilder sb, T value); 096 } 097 098 /** 099 * Callback interface used with the 100 * {@link StringUtils#join(Map, String, JoinMapCallback)} method. 101 * @author Michael Angstadt 102 * @param <K> the key class 103 * @param <V> the value class 104 */ 105 public static interface JoinMapCallback<K, V> { 106 void handle(StringBuilder sb, K key, V value); 107 } 108 }