Мне нужно написать код, чтобы проверить длину моего ввода И его начало. В зависимости от этих двух параметров мне придется изменить ввод. Мне удалось проверить длину моего ввода. Но я с трудом пытаюсь проверить начало своего ввода.
Вот и я пока:
Long number = ean12;
String inputEan12 = Long.toString(ean12);
if (inputEan12.length() == 12) {
if (inputEan12.startsWith("02"||"21"||"22"||"23"||"24"||"25"||"26"||"27"||"28"||"29")
//SOME CODE
} else {
//SOME OTHER CODE
}
} else if (inputEan12.length() == 11) {
//SOME MORE CODE
} else {
System.out.println("All is good!");
}
Я решил использовать метод ".startsWith ()" для проверки, полагая, что это легко решит мою проблему. Но я могу делать только одну проверку за раз. Кажется, мне нужно добавить «если» для каждого начала / числа, которое я хочу проверить. Превратится в большого белого слона ...
Поэтому я подумал об использовании таблицы (например: «String [] myTable»), чтобы поместить внутрь все мои «начальные переменные» и выполнить цикл по этой таблице. Но этот метод startWith () не позволяет мне этого делать. Похоже, моя приставка должна быть простой.
Любое решение или совет, чтобы дать мне легко проверить начало моего ввода?
Поместите все возможные значения в список (или установите) и используйте Collection.contains (subStr)?
Некоторые люди, столкнувшись с проблемой, думают: «Я знаю, я буду использовать регулярные выражения». Теперь у них две проблемы;)
Я не думаю, что при преобразовании long в String вы когда-нибудь получите префикс «02» ... возможно, вы захотите переосмыслить свои типы данных.
спасибо за ваш добрый совет @OH GOD SPIDERS. Это должно быть основная ошибка, но я все еще новичок в Java. Это объясняет это. Спасибо за помощь.




Используйте регулярное выражение.
// either "02" or "2 and any number between 1 and 9"
Pattern p = Pattern.compile("(02|2[1-9]).*");
if (inputEan12.length() == 12) {
if (p.matcher(inputEan).matches()) {
// code
}
}
вы можете использовать .matches(String regex) так:
if (inputEan12.matches("^(02|21|22|23|24|25|26|27|28|29).*$"){ }
Вот оно, надеюсь, это то, что вы ищете:
List<String> possibleValues = Arrays.asList("02", "21", "22", "23", "24", "25", "26", "27", "28", "29");
if (possibleValues.contains(inputEan12.substring(0, 2))) {
//SOME CODE
}
Для эффективности Set, вероятно, был бы лучше, чем List.
Согласен, но для удобства Arrays.asList(...) кажется намного проще
Начиная с Java 9 у нас тоже есть Set.of(...). Для более ранних версий все, что нам нужно, это обернуть список в набор вроде new HashSet<>(Arrays.asList(...)).
Также полезно знать, и если OP запускает Java 9, это проще, чем то, что я написал!
Я все еще использую Java 8. Итак, ваше решение идеально подошло для моего случая. Спасибо, HBo!
Не за что. Примите этот ответ, если хотите!
Нет такого короткого синтаксиса or, как у startsWith. Вы мог используете несколько вызовов String.startsWith, разделенных || (что логически является тем, что вы написали). Но было бы короче взять массив действительных префиксов и подстроку inputEan12, которая вам нужна, и использовать anyMatch с Arrays.stream. Нравиться,
Long number = ean12;
String inputEan12 = Long.toString(ean12);
String[] prefixes = { "02", "21", "22", "23", "24", "25", "26", "27", "28", "29" };
if (inputEan12.length() == 12) {
String firstTwo = inputEan12.substring(0, 2);
if (Arrays.stream(prefixes).anyMatch(firstTwo::equals)) {
// SOME CODE
} else {
// SOME OTHER CODE
}
} else if (inputEan12.length() == 11) {
// SOME MORE CODE
} else {
System.out.println("All is good!");
}
Спасибо, @Elliot Frisch. Это мне тоже очень помогло!
Или просто повторите:
public static void main(final String[] args) {
String inputEan12 = "ean12";
if (inputEan12.length() == 12) {
if (startsWith(inputEan12, "02", "21", "22", "23", "24", "25", "26", "27", "28", "29")) {
//SOME CODE
} else {
//SOME OTHER CODE
}
}
}
private static boolean startsWith(final String string, final String... possibilities) {
for (String prefix : possibilities) {
if (string.startsWith(prefix)) {
return true;
}
}
return false;
}
Если вы хотите использовать внешнюю библиотеку, подойдет Commons Lang StringUtils.startsWithAny:
if (StringUtils.startsWithAny(inputEan12, "02", "21", "22", etc...)
{
// do stuff
}
Вы не можете связать параметры метода с помощью или
||вместе. Вы должны связать полный вызов метода вместе:inputEan12.startsWith("02")||inputEan12.startsWith("21")