2017-02-16 35 views
1

在我正在處理的程序中,我必須找到一個包含在未指定的輸入量中的字母對。如果找到兩個相同的,不區分大小寫的連續英文字母,那麼我在我的2d數組內的一個元素中添加一個26行乘26列的元素。這裏是我的代碼:Java二維數組添加一個元素錯誤

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 i = 0; i < alphabet.length; i++) { 
      for(int j = 0; j < alphabet[i].length; j++) { 
       for (int a = 0; a < line.length() - 1; a++) { 
        char firstLetter = line.charAt(a); 
        char secondLetter = line.charAt(a + 1); 
        if (firstLetter == secondLetter) { 
         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(); 
    } 
    } 
} 

然而,當我運行了一個程序,輸入「aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz」 這是發生了什麼:

aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz 
676 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 676 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 676 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 676 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 676 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 676 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 676 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 676 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 676 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 676 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 676 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 676 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 676 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 676 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 676 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 676 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 676 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 676 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 676 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 676 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 676 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 676 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 676 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 676 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 676 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 676 

我相信他們是在正確的位置進行添加,但爲什麼我的程序將676添加到索引,而不是僅添加1?任何幫助是極大的讚賞。謝謝!

回答

2

您的processLine()方法沒有多大意義。首先,你應該只遍歷輸入字符串,而不是整個二維數組,即:

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); 
     if (firstLetter == secondLetter) { 
      alphabet[firstLetter - 65][secondLetter - 65] += 1; 
     } 
    } 
} 

其次,你的二維數組將只對對角線項,因爲你永遠只進行分配,其中兩個尺寸的兩個字符是相同的。所以,你可以只使用一維數組:

private static int[] alphabet = new int[ROWS]; 

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); 
     if (firstLetter == secondLetter) { 
      alphabet[firstLetter - 65] += 1; 
     } 
    } 
} 
+0

哇,我覺得這麼愚蠢哈哈。感謝您的幫助。另外,如果我有「aaaa」,並且我只希望我的數組中的第一個元素被添加一次? – Coder117

+0

'aaaabbbbaaaa'會發生什麼? 「aa」還是僅有一個? –

+0

只有一個,我只是在尋找每行出現的一個字母對 – Coder117

1

什麼你正在做的是,你從那個位置上的矩陣1增值而不是如果你想1在那個地方只是爲它分配 替換該行

alphabet[firstLetter - 65][secondLetter - 65] += 1; 

與此

alphabet[firstLetter - 65][secondLetter - 65] = 1; 

或更改ProcessLine從方法到這個

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); 
        if (firstLetter == secondLetter) { 
         alphabet[firstLetter - 65][secondLetter - 65] += 1; 
      } 
     } 
    } 

希望這回答你的問題