Optimize ChatColor.getLastColors.
ChatColor searches from the start to the end of a string for chat format characters but this always has to search the entire string. By starting from the end of the string and working backwards we can stop searching once we find a color code or a reset code as any previous formatting is wiped out by these.
This commit is contained in:
parent
5a7f09f1a7
commit
f4bee983b0
@ -218,19 +218,21 @@ public enum ChatColor {
|
|||||||
*/
|
*/
|
||||||
public static String getLastColors(String input) {
|
public static String getLastColors(String input) {
|
||||||
String result = "";
|
String result = "";
|
||||||
int lastIndex = -1;
|
|
||||||
int length = input.length();
|
int length = input.length();
|
||||||
|
|
||||||
while ((lastIndex = input.indexOf(COLOR_CHAR, lastIndex + 1)) != -1) {
|
// Search backwards from the end as it is faster
|
||||||
if (lastIndex < length - 1) {
|
for (int index = length - 1; index > -1; index--) {
|
||||||
char c = input.charAt(lastIndex + 1);
|
char section = input.charAt(index);
|
||||||
ChatColor col = getByChar(c);
|
if (section == COLOR_CHAR && index < length - 1) {
|
||||||
|
char c = input.charAt(index + 1);
|
||||||
|
ChatColor color = getByChar(c);
|
||||||
|
|
||||||
if (col != null) {
|
if (color != null) {
|
||||||
if (col.isColor()) {
|
result = color.toString() + result;
|
||||||
result = col.toString();
|
|
||||||
} else if (col.isFormat()) {
|
// Once we find a color or reset we can stop searching
|
||||||
result += col.toString();
|
if (color.isColor() || color.equals(RESET)) {
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -70,4 +70,14 @@ public class ChatColorTest {
|
|||||||
String u = ChatColor.BLACK.toString() + ChatColor.DARK_BLUE + ChatColor.DARK_GREEN + ChatColor.DARK_AQUA + ChatColor.DARK_RED + ChatColor.DARK_PURPLE + ChatColor.GOLD + ChatColor.GRAY + ChatColor.DARK_GRAY + ChatColor.BLUE + ChatColor.GREEN + ChatColor.GREEN + ChatColor.AQUA + ChatColor.AQUA + ChatColor.RED + ChatColor.RED + ChatColor.LIGHT_PURPLE + ChatColor.LIGHT_PURPLE + ChatColor.YELLOW + ChatColor.YELLOW + ChatColor.WHITE + ChatColor.WHITE + ChatColor.MAGIC + ChatColor.MAGIC + " & more";
|
String u = ChatColor.BLACK.toString() + ChatColor.DARK_BLUE + ChatColor.DARK_GREEN + ChatColor.DARK_AQUA + ChatColor.DARK_RED + ChatColor.DARK_PURPLE + ChatColor.GOLD + ChatColor.GRAY + ChatColor.DARK_GRAY + ChatColor.BLUE + ChatColor.GREEN + ChatColor.GREEN + ChatColor.AQUA + ChatColor.AQUA + ChatColor.RED + ChatColor.RED + ChatColor.LIGHT_PURPLE + ChatColor.LIGHT_PURPLE + ChatColor.YELLOW + ChatColor.YELLOW + ChatColor.WHITE + ChatColor.WHITE + ChatColor.MAGIC + ChatColor.MAGIC + " & more";
|
||||||
assertThat(t, is(u));
|
assertThat(t, is(u));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getChatColors() {
|
||||||
|
String s = String.format("%c%ctest%c%ctest%c", ChatColor.COLOR_CHAR, ChatColor.RED.getChar(), ChatColor.COLOR_CHAR, ChatColor.ITALIC.getChar(), ChatColor.COLOR_CHAR);
|
||||||
|
String expected = ChatColor.RED.toString() + ChatColor.ITALIC;
|
||||||
|
assertThat(ChatColor.getLastColors(s), is(expected));
|
||||||
|
|
||||||
|
s = String.format("%c%ctest%c%ctest", ChatColor.COLOR_CHAR, ChatColor.RED.getChar(), ChatColor.COLOR_CHAR, ChatColor.BLUE.getChar());
|
||||||
|
assertThat(ChatColor.getLastColors(s), is(ChatColor.BLUE.toString()));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user