Set StringList as CharSequence. Add StringList tests.
This commit is contained in:
parent
587de36df6
commit
620399fd97
5 changed files with 438 additions and 6 deletions
|
@ -83,7 +83,7 @@ org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_de
|
|||
org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
|
||||
org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
|
||||
org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
|
||||
org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
|
||||
org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=false
|
||||
org.eclipse.jdt.core.formatter.indent_empty_lines=false
|
||||
org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
|
||||
org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
|
||||
|
|
|
@ -13,9 +13,11 @@ import java.util.ArrayList;
|
|||
* possible to build a string without any copy. The goal is to optimize the
|
||||
* building of strings where they are lot of concatenation action.
|
||||
*/
|
||||
public class StringList extends ArrayList<String>
|
||||
public class StringList extends ArrayList<String> implements CharSequence
|
||||
{
|
||||
|
||||
private static final long serialVersionUID = -1154185934830213732L;
|
||||
|
||||
public static final String LINE_SEPARATOR = "\n";
|
||||
|
||||
/**
|
||||
|
@ -288,6 +290,24 @@ public class StringList extends ArrayList<String>
|
|||
return (result);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
@Override
|
||||
public char charAt(final int index)
|
||||
{
|
||||
char result;
|
||||
|
||||
//
|
||||
StringListCharPosition position = indexOf(index);
|
||||
|
||||
//
|
||||
result = get(position.getStringIndex()).charAt(position.getLocalCharIndex());
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
|
@ -303,7 +323,47 @@ public class StringList extends ArrayList<String>
|
|||
|
||||
/**
|
||||
*
|
||||
* @param index
|
||||
* @return
|
||||
*/
|
||||
public StringListCharPosition indexOf(final int index)
|
||||
{
|
||||
StringListCharPosition result;
|
||||
|
||||
if ((index < 0) || (index >= length()))
|
||||
{
|
||||
throw new StringIndexOutOfBoundsException(index);
|
||||
}
|
||||
else
|
||||
{
|
||||
boolean ended = false;
|
||||
int stringIndex = 0;
|
||||
int currentLength = 0;
|
||||
result = null;
|
||||
while (!ended)
|
||||
{
|
||||
if (index < currentLength + get(stringIndex).length())
|
||||
{
|
||||
ended = true;
|
||||
result = new StringListCharPosition(index, stringIndex, index - currentLength);
|
||||
}
|
||||
else
|
||||
{
|
||||
stringIndex += 1;
|
||||
currentLength += get(stringIndex).length();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
@Override
|
||||
public int length()
|
||||
{
|
||||
int result = 0;
|
||||
|
@ -353,6 +413,91 @@ public class StringList extends ArrayList<String>
|
|||
return (result);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
@Override
|
||||
public CharSequence subSequence(final int start, final int end)
|
||||
{
|
||||
StringList result;
|
||||
|
||||
result = substring(start, end);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param start
|
||||
* @param end
|
||||
* @return
|
||||
*/
|
||||
public StringList substring(final int beginIndex, final int endIndex)
|
||||
{
|
||||
StringList result;
|
||||
|
||||
if (beginIndex < 0)
|
||||
{
|
||||
throw new StringIndexOutOfBoundsException(beginIndex);
|
||||
}
|
||||
else if (endIndex > length())
|
||||
{
|
||||
throw new StringIndexOutOfBoundsException(endIndex);
|
||||
}
|
||||
else if (beginIndex > endIndex)
|
||||
{
|
||||
throw new StringIndexOutOfBoundsException(endIndex - beginIndex);
|
||||
}
|
||||
else if (beginIndex == endIndex)
|
||||
{
|
||||
result = new StringList();
|
||||
}
|
||||
else
|
||||
{
|
||||
//
|
||||
result = new StringList();
|
||||
|
||||
//
|
||||
StringListCharPosition startPosition = indexOf(beginIndex);
|
||||
StringListCharPosition endPosition = indexOf(endIndex);
|
||||
|
||||
//
|
||||
if (startPosition.getStringIndex() == endPosition.getStringIndex())
|
||||
{
|
||||
String source = get(startPosition.getStringIndex());
|
||||
String target = source.substring(startPosition.getLocalCharIndex(), endPosition.getLocalCharIndex());
|
||||
result.append(target);
|
||||
}
|
||||
else
|
||||
{
|
||||
//
|
||||
{
|
||||
String source = get(startPosition.getStringIndex());
|
||||
String target = source.substring(startPosition.getLocalCharIndex());
|
||||
result.append(target);
|
||||
}
|
||||
|
||||
//
|
||||
for (int stringIndex = startPosition.getStringIndex() + 1; stringIndex < endPosition.getStringIndex(); stringIndex++)
|
||||
{
|
||||
String target = get(stringIndex);
|
||||
result.append(target);
|
||||
}
|
||||
|
||||
//
|
||||
{
|
||||
String source = get(endPosition.getStringIndex());
|
||||
String target = source.substring(0, endPosition.getLocalCharIndex());
|
||||
result.append(target);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
|
@ -361,7 +506,7 @@ public class StringList extends ArrayList<String>
|
|||
{
|
||||
String result;
|
||||
|
||||
StringBuffer buffer = new StringBuffer(this.length());
|
||||
StringBuffer buffer = new StringBuffer(length());
|
||||
|
||||
for (String string : this)
|
||||
{
|
||||
|
|
55
src/fr/devinsy/util/StringListCharPosition.java
Normal file
55
src/fr/devinsy/util/StringListCharPosition.java
Normal file
|
@ -0,0 +1,55 @@
|
|||
/**
|
||||
* @author Christian Momon, 2013.
|
||||
* This file is free software under the terms of the GNU Library General Public License
|
||||
* as published by the Free Software Foundation version 2 or any later version.
|
||||
*/
|
||||
package fr.devinsy.util;
|
||||
|
||||
/**
|
||||
* This class manages a char position in a StringList object.
|
||||
*
|
||||
* @author Christian P. Momon
|
||||
*/
|
||||
public class StringListCharPosition
|
||||
{
|
||||
private int charIndex;
|
||||
private int stringIndex;
|
||||
private int localCharIndex;
|
||||
|
||||
public StringListCharPosition(final int index, final int stringIndex, final int localIndex)
|
||||
{
|
||||
this.charIndex = index;
|
||||
this.stringIndex = stringIndex;
|
||||
this.localCharIndex = localIndex;
|
||||
}
|
||||
|
||||
public int getCharIndex()
|
||||
{
|
||||
return charIndex;
|
||||
}
|
||||
|
||||
public int getLocalCharIndex()
|
||||
{
|
||||
return localCharIndex;
|
||||
}
|
||||
|
||||
public int getStringIndex()
|
||||
{
|
||||
return stringIndex;
|
||||
}
|
||||
|
||||
public void setCharIndex(final int charIndex)
|
||||
{
|
||||
this.charIndex = charIndex;
|
||||
}
|
||||
|
||||
public void setLocalCharIndex(final int localCharIndex)
|
||||
{
|
||||
this.localCharIndex = localCharIndex;
|
||||
}
|
||||
|
||||
public void setStringIndex(final int stringIndex)
|
||||
{
|
||||
this.stringIndex = stringIndex;
|
||||
}
|
||||
}
|
235
test/fr/devinsy/util/StringListTest.java
Normal file
235
test/fr/devinsy/util/StringListTest.java
Normal file
|
@ -0,0 +1,235 @@
|
|||
package fr.devinsy.util;
|
||||
|
||||
import org.apache.log4j.BasicConfigurator;
|
||||
import org.apache.log4j.Level;
|
||||
import org.apache.log4j.Logger;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Christian P. Momon
|
||||
*/
|
||||
public class StringListTest
|
||||
{
|
||||
static protected org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(StringListTest.class);
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
@Before
|
||||
public void before()
|
||||
{
|
||||
BasicConfigurator.configure();
|
||||
Logger.getRootLogger().setLevel(Level.ERROR);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
@Test
|
||||
public void testCharAt01()
|
||||
{
|
||||
//
|
||||
logger.debug("===== test starting...");
|
||||
|
||||
//
|
||||
StringList source = new StringList();
|
||||
source.append("abcdefghijklm");
|
||||
|
||||
//
|
||||
char target = source.charAt(0);
|
||||
Assert.assertEquals(target, 'a');
|
||||
|
||||
//
|
||||
target = source.charAt(4);
|
||||
Assert.assertEquals(target, 'e');
|
||||
|
||||
//
|
||||
target = source.charAt(11);
|
||||
Assert.assertEquals(target, 'l');
|
||||
|
||||
//
|
||||
logger.debug("===== test done.");
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
@Test
|
||||
public void testCharAt02()
|
||||
{
|
||||
//
|
||||
logger.debug("===== test starting...");
|
||||
|
||||
//
|
||||
StringList source = new StringList();
|
||||
source.append("abc");
|
||||
source.append("def");
|
||||
source.append("ghi");
|
||||
source.append("jkl");
|
||||
source.append("mno");
|
||||
|
||||
//
|
||||
char target = source.charAt(0);
|
||||
Assert.assertEquals('a', target);
|
||||
|
||||
//
|
||||
target = source.charAt(4);
|
||||
Assert.assertEquals('e', target);
|
||||
|
||||
//
|
||||
target = source.charAt(11);
|
||||
Assert.assertEquals('l', target);
|
||||
|
||||
//
|
||||
logger.debug("===== test done.");
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
@Test(expected = IndexOutOfBoundsException.class)
|
||||
public void testCharAtException01()
|
||||
{
|
||||
//
|
||||
logger.debug("===== test starting...");
|
||||
|
||||
//
|
||||
StringList source = new StringList();
|
||||
source.append("abcdefghijklm");
|
||||
|
||||
//
|
||||
char target = source.charAt(-2);
|
||||
Assert.assertEquals('a', target);
|
||||
|
||||
//
|
||||
logger.debug("===== test done.");
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
@Test(expected = IndexOutOfBoundsException.class)
|
||||
public void testCharAtException02()
|
||||
{
|
||||
//
|
||||
logger.debug("===== test starting...");
|
||||
|
||||
//
|
||||
StringList source = new StringList();
|
||||
source.append("abcdefghijklm");
|
||||
|
||||
//
|
||||
char target = source.charAt(100);
|
||||
Assert.assertEquals('a', target);
|
||||
|
||||
//
|
||||
logger.debug("===== test done.");
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
@Test(expected = IndexOutOfBoundsException.class)
|
||||
public void testCharAtException03()
|
||||
{
|
||||
//
|
||||
logger.debug("===== test starting...");
|
||||
|
||||
//
|
||||
StringList source = new StringList();
|
||||
source.append("abcdefghijklm");
|
||||
|
||||
//
|
||||
char target = source.charAt(source.length());
|
||||
Assert.assertEquals('a', target);
|
||||
|
||||
//
|
||||
logger.debug("===== test done.");
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
@Test
|
||||
public void testSubstring01()
|
||||
{
|
||||
//
|
||||
logger.debug("===== test starting...");
|
||||
|
||||
//
|
||||
StringList source = new StringList();
|
||||
source.append("hamburger");
|
||||
|
||||
//
|
||||
StringList target = source.substring(4, 8);
|
||||
Assert.assertEquals("urge", target.toString());
|
||||
|
||||
//
|
||||
logger.debug("===== test done.");
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
@Test
|
||||
public void testSubstring02()
|
||||
{
|
||||
//
|
||||
logger.debug("===== test starting...");
|
||||
|
||||
//
|
||||
StringList source = new StringList();
|
||||
source.append("ham").append("bur").append("ger");
|
||||
|
||||
//
|
||||
StringList target = source.substring(4, 8);
|
||||
Assert.assertEquals("urge", target.toString());
|
||||
|
||||
//
|
||||
logger.debug("===== test done.");
|
||||
}
|
||||
|
||||
/**
|
||||
*/
|
||||
@Test
|
||||
public void testSubstring03()
|
||||
{
|
||||
//
|
||||
logger.debug("===== test starting...");
|
||||
|
||||
//
|
||||
StringList source = new StringList();
|
||||
source.append("smiles");
|
||||
|
||||
//
|
||||
StringList target = source.substring(1, 5);
|
||||
Assert.assertEquals("mile", target.toString());
|
||||
|
||||
//
|
||||
logger.debug("===== test done.");
|
||||
}
|
||||
|
||||
/**
|
||||
*/
|
||||
@Test
|
||||
public void testSubstring04()
|
||||
{
|
||||
//
|
||||
logger.debug("===== test starting...");
|
||||
|
||||
//
|
||||
StringList source = new StringList();
|
||||
source.append("sm").append("il").append("es");
|
||||
|
||||
//
|
||||
StringList target = source.substring(1, 5);
|
||||
Assert.assertEquals("mile", target.toString());
|
||||
|
||||
//
|
||||
logger.debug("===== test done.");
|
||||
}
|
||||
|
||||
}
|
|
@ -5,9 +5,6 @@ import org.junit.Test;
|
|||
|
||||
public class Foo2Test
|
||||
{
|
||||
// static private final Logger logger =
|
||||
// LoggerFactory.getLogger(PdfGenerationAmqpServiceInjectedTest.class);
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
|
|
Loading…
Reference in a new issue