2015-01-19 6 views
0

Как я могу получить письмо от угадывания алфавита? Таким образом, если первая догадка ААББ мне нужно, чтобы получить A и B из строки алфавита, чтобы сделать новое случайное предположение без букв А и В.Удалить письмо из строки в цикле for

randomCode.clear();//Clears the random code ArrayList to put a new one in it 
    Random r = new Random(); 
    String alphabet = "ABCDEF"; 
    StringBuilder result = new StringBuilder(randomCode.size()); 

    if(turn == 0){ 
     guess = "AABB"; 

    }else{ 
     if(blackPin == 0 && whitePin ==0){ 
      for (int c = 0; c < 4; c++) { 
       if(alphabet.charAt(c) == guess.charAt(c)){ 

       } 
       randomCode.add(alphabet.charAt(r.nextInt(alphabet.length())));//generate 4 random letters with the letters ABCDEF and put in arrayList 
      } 
      for (Character c : randomCode){//Converts Char[] randomCode to a String 
       result.append(c); 
       } 
      guess = result.toString();//Gives the String guess 4 random letters. 
+0

Iterate над гольцов и сравнить их по одному. Если вы используете «содержит», он скажет вам, что он там, а не сколько раз. – Stultuske

+0

Строка в java неизменна, поэтому символ не может быть удален в строке. Для удаления символа используйте StringBuilder !!! – Devavrata

+0

Неважно, сколько раз. Если он там, то он удаляется –

ответ

0

Если у вас есть ArrayList, например:

ArrayList<Character> alphabet = new ArrayList<>(Arrays.asList('A', 'B', 'C', 'D')); 

И String:

String guess = "AABB"; 

Вы можете удалить из алфавита каждое письмо, которое происходит в угадать, как показано:

for (int i = 0; i < guess.length(); i++) 
    alphabet.remove(new Character(guess.charAt(i))); 

Теперь, если распечатать алфавит:

for (int i = 0; i < alphabet.size(); i++) 
    System.out.print(alphabet.get(i)); 

выход будет: "CD".

Вы можете использовать это все вместе:

ArrayList<Character> alphabet = new ArrayList<>(Arrays.asList('A', 'B', 'C', 'D')); 
Random random = new Random(); 
String guess = ""; 

while (true) { 
    /* init a guess */ 
    guess = ""; 
    for (int j = 0; j < 4; j++) 
     guess += alphabet.get(random.nextInt(alphabet.size())); 
    System.out.println("The guess is: " + guess); 

    /* remove letters */ 
    for (int j = 0; j < guess.length(); j++) 
     alphabet.remove(new Character(guess.charAt(j))); 

    /* the alphabet is empty */ 
    if (alphabet.isEmpty()) { 
     System.out.println("The alphabet is empty"); 
     break; 
    } 
} 
0

Почему цикл, когда вы можете избежать:

String abd = "ABCDEF"; 
String guess = "AABB"; 
System.out.println(abd.replaceAll(String.join("|", guess.split("")), "")); 

печатается:

CDEF

+0

С точки зрения * сложности * это решение равно * O (n) *, точно так же, как «цикл», который сканирует каждую букву ввода (всегда * O (п) *). –

0

Наиболее эффективный способ сделать это, чтобы использовать тот факт, что ASCII-коды букв 26 последовательных целых чисел, и литая из полукокса в междунар. Кодами 65-68 являются ABCD.

http://www.ascii-code.com/

Смежные вопросы