2017-02-16 8 views
1

ОБНОВЛЕНИЕ НА НОМЕРЕ:Ошибка Java 2d Array Logic

Я создаю программу с 2-мерным массивом. Массив имеет 26 строк и 26 столбцов. Я ищу, по одной строке, для двухзначных пар без регистра, таких как: «AA», «AB», «AC», «AD» и т. Д. Если я нахожу пару букв, добавляю один к соответствующему индексу в массиве. Первая буква определяет строку, а вторая буква определяет столбец. Например, это, как предполагается запустить:

aa 
ab 
ac 
ad 
ba 
bb 
bc 
za 
zb 
zc 
1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 

Моя программа умеет делать выше, однако, когда я вход:

AABBAACCAA 
AA 
4 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 

Я хочу, чтобы верхний левый наибольшее число, которое в настоящее время говорит 4 , сказать 2. Другими словами, я хочу, чтобы какая-либо конкретная пара букв была , подсчитывалась только один раз в строке. Так что если я вход AAAAAAAAAAA, я хочу только добавить один алфавиту [0] [0] Вот мой код:

import java.util.Scanner; 

public class Freq{ 
    private static final int ROWS = 26; 
    private static final int COLS = 26; 
    private static int[] [] alphabet = new int[ROWS][COLS]; 
    public static void main(String[] args) { 
     String line; 
     Scanner userInput = new Scanner(System.in); 
     while(userInput.hasNextLine()) { 
      line = userInput.nextLine(); 
      processLine(line); 

     } 
     printArray(); 

    } 
    public static void processLine(String line) { 
     line = line.toUpperCase(); 
     for(int a = 0; a < line.length() - 1; a++) { 
      char firstLetter = line.charAt(a); 
      char secondLetter = line.charAt(a + 1); 
      alphabet[firstLetter - 65][secondLetter - 65] += 1; 

     } 
    } 
    public static void printArray() { 
    for (int b = 0; b < alphabet.length; b++) { 
     for (int c = 0; c < alphabet[b].length; c++){ 
      System.out.print(alphabet[b][c] + " "); 
     } 
     System.out.println(); 
    } 
    } 
} 

Любая помощь приветствуется. UPDATE: Верхняя строка моего массива представляет эти два-буквенные пары:

AA AB AC AD AE AF AG AH AI AJ AK AL AM AO AP AQ AR AS AT AU AV AW AX AY AZ

вторая строка представляет эти две пары букв: Б.А. ВВ БК BD BE BF BG BH BI BJ БК БЛ БМ БН БО БР ВР БК БС БТ БУ Б.В. BW ВХ ПО BZ

т.д. строка: «Это тест "имеет эти пары букв: TH, HI, IS, IS, TE, ES, ST. Это все вхождения пары букв в этой строке. Тем не менее, я хочу считать каждую пару букв только один раз, поэтому для моих целей я хочу записать эту строку как имеющую эти пары букв: TH, HI, IS, TE, ES, ST. Обратите внимание, что IS нет в списке дважды, как я ищу только в одном случае в строке ввода

Это означает, что, если я вхожу в одна линия:

AAAAAAAAAAAA

Я только хочу добавить 1 к первому элементу в моем массиве. Поэтому я хотел бы верхний ряд моего массива выглядеть следующим образом:

1 0 0 0 0 0 0 ...

Однако, если ввести строку «AAAAAAAAAAAA» на несколько строк, как это :

А.А.
А.А.
А.А.
А.А.
А.А.
А.А.
А.А.

Затем я хочу добавить 6 к первому элементу моего массива. Потому что AA произошел 6 раз по 6 разным линиям Так что я хотел бы, чтобы верхняя строка моего массива выглядела так:

6 0 0 0 0 0 0 ...

+0

Возможно, массив не может быть хорошим выбором, поскольку ширина фиксирована, и на практике вы не знаете, сколько совпадений вы получите. –

+0

Ширина не должна быть переменной. Все, что я делаю, это добавить к элементу массива. Мне не нужно создавать больше индексов, исходя из того, сколько совпадений я нахожу. Если я нахожу совпадение, я просто добавляю его в соответствующий элемент. То, что я не знаю, как это сделать, - это если у меня несколько строк в строке, я просто хочу добавить один, не более одного. – Coder117

+0

Я дал вам ответ ниже, который, я думаю, должен работать здесь. –

ответ

1

Следующая реализация добавляет двумерный логический массив называется visited, который отслеживает ли данная пара писем было видно для текущей строки , Если мы сталкиваемся с парой букв, для данной строки, которую мы не видели раньше, мы добавляем ее к общей для этой ячейки. Но повторение одной и той же пары в текущей строке будет проигнорировано, и общее число не будет двигаться вверх. Потребив каждую строку, мы сбрасываем массив visited на false для каждой пары, чтобы его можно было повторно использовать с исходящей строкой.

public class Freq { 
    private static final int ROWS = 26; 
    private static final int COLS = 26; 
    private static int[][] alphabet = new int[ROWS][COLS]; 
    private static boolean[][] visited = new boolean[ROWS][COLS]; 

    public static void main(String[] args) { 
     String line; 
     Scanner userInput = new Scanner(System.in); 
     while (userInput.hasNextLine()) { 
      clearVisited(); 
      line = userInput.nextLine(); 
      processLine(line); 
     } 
     printArray(); 
    } 

    public static void clearVisited() { 
     for (int r=0; r < visited.length; r++) { 
      for (int c=0; c < visited[r].length; c++){ 
       visited[r][c] = false; 
      } 
     } 
    } 

    public static void processLine(String line) { 
     line = line.toUpperCase(); 
     for (int i=0; i < line.length()-1; i++) { 
      char firstLetter = line.charAt(i); 
      char secondLetter = line.charAt(i + 1); 
      if (!visited[firstLetter-65][secondLetter-65]) { 
       alphabet[firstLetter - 65][secondLetter - 65] += 1; 
       visited[firstLetter-65][secondLetter-65] = true; 
      } 
     } 
    } 
} 
2

Просто поставил условие здесь:

for (int a=0; a < line.length() - 1; a++) { 
    char firstLetter = line.charAt(a); 
    char secondLetter = line.charAt(a + 1); 
    if (alphabet[firstLetter - 65][secondLetter - 65] == 0) { // Put it here 
     alphabet[firstLetter - 65][secondLetter - 65] = 1; 
    } 
} 
+0

, пожалуйста, поставьте чек в мой ответ, если он прав, чтобы помочь другому. Спасибо! –

+0

Но тогда если я ввожу: «AA», «AA» и «AABBAA» на трех разных строках, у меня все еще есть значение одного в моем первом элементе, но мне нужно иметь значение 3. – Coder117

+0

Должен ли я снова задайте вопрос, чтобы узнать, отвечает ли кто-нибудь еще? – Coder117

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

  • Нет связанных вопросов^_^