2014-12-08 2 views
2

У меня есть строка, которая всегда содержит й или у, и у меня есть для проверки на основе ниже условияСтроки проверка состояния

  • Условия 1: Если все символы являются такими же верный (как: «ХХХХМ»)
  • Условие 2: Если все одинаковы, за исключением одного символа, возвращаемого true (например, : 'xxxxy')
  • Условие 3: Если все символы одинаковы, а другой символ больше , чем один раз retun false. (Например: «xxxyy» // y существует 2 раза)

Как проверить это без написания комплекса для цикла с условием. Есть ли решение с использованием xor или будет полезно, если я буду хранить строку как boolen или number (x = 1 или true y = 0 или false).

+0

Так 'yyyyx' правда, и' yyyxyyx' ложь что такое «xyxyx' –

+0

Состояние 3 не делает чувство для меня, может остановиться на этом? немного лучше спасибо –

+0

Да @JonathanM В yyyyx большинство есть y и один x разрешено, но в yyyxyyx большинство - это y, но x встречается более одного раза – Sumeet

ответ

2

x*(yx*)?|y*(xy*)? похоже делает, что вы хотите. Вы можете изменить сначала * на +, если вы не хотите принимать пустые строки.

Вкратце:

  • * является квантификатором смысл, что элемент, прежде чем он может появиться ноль или более раз
  • ? означает, что элемент, прежде чем он не является обязательным
  • | является оператором ИЛИ

так в x*(yx*)

  • x* представляет ноль или более x символов, что означает, что он может представлять собой пустую строку "", x, xx, xxx, и так далее
  • yx* может представлять строки, которые y с нулем или более x эс после это как y, yx, yxx

Это регулярное выражение пытается проверить, если строка либо

  • xxxx с дополнительным yxxx части,
  • yyyy с дополнительным xyyy части.

Demo

String regex = "x*(yx*)?|y*(xy*)?"; 

System.out.println("xxx".matches(regex)); 
System.out.println("xxxy".matches(regex)); 
System.out.println("xxyx".matches(regex)); 
System.out.println("xxxyy".matches(regex)); 

Выход:

true 
true 
true 
false 

Как проверить это без написания комплекса для цикла с условием

Это зависит от того, что вы подразумеваете под complex. Петля, такие как это довольно просто IMO

public static boolean check(String text){ 
    long xCounter = 0; 
    long yCounter = 0; 
    for (char ch : text.toCharArray()){ 
     if (ch=='x') xCounter++; 
     else if (ch=='y') yCounter++; 
     else return false;//non x or y appeared 
    } 
    return xCounter < 2 || yCounter < 2; 
} 
+0

Но это может быть «Y» между ними как xxyxx? Тогда также он должен вернуть true – Sumeet

+0

@Sumeet. Попробуй это. – Pshemo

+0

спасибо, что он сработал отлично – Sumeet

0

Там нет необходимости прибегать к регулярным выражениям здесь, я должен думать; компиляция регулярного выражения, скорее всего, займет больше времени выполнения, чем просто прохождение строки и проверка символов. (Сообщение помечено «производительность, после того, как все)

Это несколько сложнее записать в симпатичной манере, чем я первый ожидал, но это не страшно, и она должна быть достаточно быстро:

public static boolean foo(String str) { 
    // if the string only has three characters, both can't be in it twice. 
    if(str.length() < 4) { 
    return true; 
    } 

    // To start with, assume that the first character is the main 
    // character (the one that appears more often). Search for the 
    // other one. 
    char needle = str.charAt(0) == 'x' ? 'y' : 'x'; 
    int first = str.indexOf(needle, 1); 

    if(first == -1) { 
    // Didn't find the other character at all. 
    return true; 
    } 

    if(first == 1) { 
    // The first two characters are different from each other. 
    // What we first thought was the main character might be 
    // the lesser after all. 
    needle = str.charAt(2) == 'x' ? 'y' : 'x'; 

    // skip unnecessary check. 
    first = 2; 
    } 

    return str.indexOf(needle, first + 1) == -1; 
} 
+0

Не будет работать для '' yxxxx'', который, как мне кажется, удовлетворяет условию 2. Возможно, с еще одним тестом вы можете поймать этот случай. – ajb

+0

А, правда. Починю. EDIT: Хм. Это становится немного уродливым, хотя, вероятно, еще быстрее, чем регулярное выражение. Позвольте мне подумать минуту. – Wintermute

+0

Будет ли он работать для xxyxx, и в этом случае он должен возвращать true, поскольку y произошел только один раз – Sumeet

0
.

Хммм я думаю, что это будет работать для вас:

if (str.length() < 4) 
    return true; 
String reduction = str.replaceAll("y",""); 
if (reduction.length() < 2 || (str.length() - reduction.length()) < 2) 
    return true; 
else 
    return false; 
Смежные вопросы