2013-09-12 3 views
2

Я пытаюсь найти, если две строки являются анаграммы друг друга:Поиск анаграммы, используя список массива

void anagram(String a, String b) { 
    List<Character> bcopy = new ArrayList<Character>(); 

    for (int i = 0; i < b.length(); i++) 
     bcopy.add(b.charAt(i)); 
    if (b.length() == 0 || a.length() == 0) { 
     System.out.println("Exit"); 
    } else { 
     for (int i = 0; i < a.length(); i++) { 
      char temp = a.charAt(i); 
      if (bcopy.contains(temp)) { 
       System.out.println("match found" + temp); 
       bcopy.remove(temp); 
      } 
      for (char j : bcopy) { 
       System.out.println("Values" + j); 
      } 
     } 
    } 
} 

Я получаю ошибку выхода за границы изменений в отдалении линии(). Может кто-нибудь, пожалуйста, скажите мне, как я достигаю границей массива, когда я ищу доступность объекта? Что мне здесь не хватает?

+2

Пробовал ли вы отлаживать и видеть состояние переменных? –

+0

Я вижу, что я получаю сообщение об ошибке только тогда, когда две строки имеют одинаковые символы. –

+0

Спасибо, но я использую содержит. Где я использовал == –

ответ

4

Проблема заключается в том, что вы используете int -argument версию remove() с момента char temp в настоящее время рассматривается как int. Вот обходной путь:

bcopy.remove(Character.valueOf(temp)); 

Кстати лучший способ проверить анаграммы будет что-то вроде:

char[] c1 = a.toCharArray(); 
char[] c2 = b.toCharArray(); 

Arrays.sort(c1); 
Arrays.sort(c2); 

return Arrays.equals(c1, c2); // true -> anagram, false -> not anagram 
+1

Aaah, спасибо! С ломать голову с утра! Благодаря!! –

+0

Спасибо, снова. Я никогда не думал об этом так! –

+0

@PR Без проблем, рад, что я мог бы помочь. Не забудьте [принять ответ] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235#5235). – arshajii

1

есть другой алгоритм, который может быть более подходящим для выполнения этой задачи. он вычисляет частоты букв для строк одинаковой длины. для простоты я предполагаю, что набор всех вовлеченных символов может быть представлен в одной из 8-битных кодовых страниц.

void anagram(String a, String b) { 
    int freqa[256], freqb[256]; 

    if (b.length() == 0 || a.length() == 0) { 
     System.out.println("Exit"); 
     return; 
    } 

    for (int i = 0; i < b.length(); i++) { 
     freqa[(int) a.charAt(i)]++; 
     freqb[(int) b.charAt(i)]++; 
    } 

    for (i = 0; i < 256; i++) { 
     if (freqa[i] <> freqb[i]) { 
      System.out.println("Exit"); 
      return; 
     } 
    } 
    System.out.println("match found: '" + a + "', '" + b + "'"); 
} 
+0

Сладкий. Спасибо за другое решение. –

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