Mega Code Archive

 
Categories / Java Tutorial / Data Type
 

Repeat a String repeat times to form a new String

import java.io.PrintWriter; import java.sql.Connection; import java.sql.SQLException; /*   * Licensed to the Apache Software Foundation (ASF) under one or more  *  contributor license agreements.  See the NOTICE file distributed with  *  this work for additional information regarding copyright ownership.  *  The ASF licenses this file to You under the Apache License, Version 2.0  *  (the "License"); you may not use this file except in compliance with  *  the License.  You may obtain a copy of the License at  *  *      http://www.apache.org/licenses/LICENSE-2.0  *  *  Unless required by applicable law or agreed to in writing, software  *  distributed under the License is distributed on an "AS IS" BASIS,  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  *  See the License for the specific language governing permissions and  *  limitations under the License.  *  */ public class Main {   /**    * The maximum size to which the padding constant(s) can expand.    */   private static final int PAD_LIMIT = 8192;   // Padding   //-----------------------------------------------------------------------   /**    * Repeat a String <code>repeat</code> times to form a    * new String.    *    * <pre>    * StringUtils.repeat(null, 2) = null    * StringUtils.repeat("", 0)   = ""    * StringUtils.repeat("", 2)   = ""    * StringUtils.repeat("a", 3)  = "aaa"    * StringUtils.repeat("ab", 2) = "abab"    * StringUtils.repeat("a", -2) = ""    * </pre>    *    * @param str  the String to repeat, may be null    * @param repeat  number of times to repeat str, negative treated as zero    * @return a new String consisting of the original String repeated,    *  <code>null</code> if null String input    */   public static String repeat(String str, int repeat) {       // Performance tuned for 2.0 (JDK1.4)       if (str == null) {           return null;       }       if (repeat <= 0) {           return "";       }       int inputLength = str.length();       if (repeat == 1 || inputLength == 0) {           return str;       }       if (inputLength == 1 && repeat <= PAD_LIMIT) {           return padding(repeat, str.charAt(0));       }       int outputLength = inputLength * repeat;       switch (inputLength) {           case 1 :               char ch = str.charAt(0);               char[] output1 = new char[outputLength];               for (int i = repeat - 1; i >= 0; i--) {                   output1[i] = ch;               }               return new String(output1);           case 2 :               char ch0 = str.charAt(0);               char ch1 = str.charAt(1);               char[] output2 = new char[outputLength];               for (int i = repeat * 2 - 2; i >= 0; i--, i--) {                   output2[i] = ch0;                   output2[i + 1] = ch1;               }               return new String(output2);           default :               StringBuffer buf = new StringBuffer(outputLength);               for (int i = 0; i < repeat; i++) {                   buf.append(str);               }               return buf.toString();       }   }   /**    * Returns padding using the specified delimiter repeated    * to a given length.    *    * <pre>    * StringUtils.padding(0, 'e')  = ""    * StringUtils.padding(3, 'e')  = "eee"    * StringUtils.padding(-2, 'e') = IndexOutOfBoundsException    * </pre>    *    * Note: this method doesn't not support padding with    * <a href="http://www.unicode.org/glossary/#supplementary_character">Unicode Supplementary Characters</a>    * as they require a pair of <code>char</code>s to be represented.    * If you are needing to support full I18N of your applications    * consider using {@link #repeat(String, int)} instead.     *     *    * @param repeat  number of times to repeat delim    * @param padChar  character to repeat    * @return String with repeated character    * @throws IndexOutOfBoundsException if <code>repeat &lt; 0</code>    * @see #repeat(String, int)    */   private static String padding(int repeat, char padChar) throws IndexOutOfBoundsException {       if (repeat < 0) {           throw new IndexOutOfBoundsException("Cannot pad a negative amount: " + repeat);       }       final char[] buf = new char[repeat];       for (int i = 0; i < buf.length; i++) {           buf[i] = padChar;       }       return new String(buf);   } }