Хотя ответы и комментарии, размещенные здесь, были полезны, они не были причиной проблемы в моем случае.
Фактическая проблема заключалась в том, что образец поступал после того, как я уничтожил объект обратного вызова. Я думал, что решил эту проблему, используя «флаг, мьютекс и переменную условия», как описано в моем комментарии, но эта реализация была неправильной.Решение, которое решило проблему, было следующим:
Я добавлю фрагмент кода, который демонстрирует это в ближайшее время
Этот метод может быть быстрее, чем сравнение строки с ее заглавной версией, поскольку он требует только одного прохода:
public static boolean isUpper(String s)
{
for(char c : s.toCharArray())
{
if(! Character.isUpperCase(c))
return false;
}
return true;
}
Обратите внимание, что могут быть некоторые проблемы с локализацией в разных наборах символов. У меня нет опыта из первых рук, но я думаю, что есть некоторые языки (например, турецкий), где разные строчные буквы могут отображаться на одну и ту же заглавную букву.
Вы можете использовать java.lang.Character.isUpperCase (). Затем вы можете легко написать метод, который проверяет, является ли ваша строка заглавной (с простым циклом).
Отправка сообщения toUpperCase () в вашу строку и последующая проверка, будет ли результат равен вашей строке, возможно, будет медленнее.
Не библиотечная функция, к сожалению, но это довольно легко к самокрутке. Если эффективность является беспокойством, это могло бы быть быстрее, чем s.toUpperCase () .equals (s), потому что это может прыгнуть с парашютом рано.
public static boolean isUpperCase(String s)
{
for (int i=0; i<s.length(); i++)
{
if (!Character.isUpperCase(s.charAt(i)))
{
return false;
}
}
return true;
}
Править: Как другие плакаты и комментаторы отметили, мы должны рассмотреть поведение, когда строка содержит символы небуквы: должен isUpperCase ("HELLO1") возвращать TRUE или FALSE? Функция выше возвратит false, потому что '1' не символ верхнего регистра, но это - возможно не поведение, которое Вы хотите. Альтернативное определение, которое возвратило бы true в этом случае, будет:
public static boolean isUpperCase2(String s)
{
for (int i=0; i<s.length(); i++)
{
if (Character.isLowerCase(s.charAt(i)))
{
return false;
}
}
return true;
}
Не то, чтобы я знаю.
Можно скопировать строку и преобразовать копию в более низкий / верхний регистр и выдержать сравнение с исходным.
Или создайте цикл, который проверяет отдельные символы, если нижний регистр или верхний регистр.
Попробуйте это, может помочь.
import java.util.regex.Pattern;
private static final String regex ="^[A-Z0-9]"; //alpha-numeric uppercase
public static boolean isUpperCase(String str){
return Pattern.compile(regex).matcher(str).find();
}
с этим кодом мы просто меняем регулярное выражение.