Java: startWith () с другим префиксом, а не только с одним

Мне нужно написать код, чтобы проверить длину моего ввода И его начало. В зависимости от этих двух параметров мне придется изменить ввод. Мне удалось проверить длину моего ввода. Но я с трудом пытаюсь проверить начало своего ввода.

Вот и я пока:

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 () не позволяет мне этого делать. Похоже, моя приставка должна быть простой.

Любое решение или совет, чтобы дать мне легко проверить начало моего ввода?

Вы не можете связать параметры метода с помощью или || вместе. Вы должны связать полный вызов метода вместе: inputEan12.startsWith("02")||inputEan12.startsWith("21")

OH GOD SPIDERS 17.04.2018 15:48

Поместите все возможные значения в список (или установите) и используйте Collection.contains (subStr)?

HBo 17.04.2018 15:49

Некоторые люди, столкнувшись с проблемой, думают: «Я знаю, я буду использовать регулярные выражения». Теперь у них две проблемы;)

Artur Biesiadowski 17.04.2018 15:51

Я не думаю, что при преобразовании long в String вы когда-нибудь получите префикс «02» ... возможно, вы захотите переосмыслить свои типы данных.

Artur Biesiadowski 17.04.2018 15:53

спасибо за ваш добрый совет @OH GOD SPIDERS. Это должно быть основная ошибка, но я все еще новичок в Java. Это объясняет это. Спасибо за помощь.

SDJ 17.04.2018 17:37
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
5
479
6

Ответы 6

Используйте регулярное выражение.

// 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.

Pshemo 17.04.2018 15:57

Согласен, но для удобства Arrays.asList(...) кажется намного проще

HBo 17.04.2018 15:58

Начиная с Java 9 у нас тоже есть Set.of(...). Для более ранних версий все, что нам нужно, это обернуть список в набор вроде new HashSet<>(Arrays.asList(...)).

Pshemo 17.04.2018 15:59

Также полезно знать, и если OP запускает Java 9, это проще, чем то, что я написал!

HBo 17.04.2018 16:01

Я все еще использую Java 8. Итак, ваше решение идеально подошло для моего случая. Спасибо, HBo!

SDJ 17.04.2018 17:36

Не за что. Примите этот ответ, если хотите!

HBo 17.04.2018 18:33

Нет такого короткого синтаксиса 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. Это мне тоже очень помогло!

SDJ 17.04.2018 17:39

Или просто повторите:

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
}

Другие вопросы по теме