1

次のコードを使用して、同じ名前で始まるすべてのアルファベットを1つの配列列にまとめ、2番目の列にアルファベットに関連付けられた数値の合計を保持したいと考えています。

例えば ​​:

array_1 = { {"bat","1"},
            {"rat","2"},
            {"ball","3"},
            {"run","4"},
            {"lizard","5"}
          }

into array_2 = { {"b","4"},
                 {"r","6"},
                 {"l",5}
                }

次のコードは、半分正しい結果を示します。それが再びそれに達するときの問題は、でball始まる次のアルファベットを追加し、bそれを別の値として保存します。問題は行番号42です。私はそれをマークしました。アルファベットが追加された後、アルファベットの番号が追加されないことを確認するにはどうすればよいですか。

package keylogger;
import java.util.Arrays;
public class ArrayTester {

private static int finalLength=0;
private static String firstAlphabet[][];
private String data[][] = { 
                               {"Nokia" , "7"},
                               {"Blackberry" , "1"},
                               {"Nimbus","10"},
                               {"Apple","19"},
                               {"Ami","21"},
                               {"Bug","35"},
                               {"Native","200"},
                               {"zebra","100"},
                               {"Nine","9"}

                          };  

public void calculator() {
   try {  
    // traverse the whole array
    firstAlphabet = new String[data.length][data.length]; // set the length of firstAlphabet array

    for(int i=0;i<data.length;i++) {
        firstAlphabet[i][0] = data[i][0].substring( 0, 1); // get the first alphabet
        firstAlphabet[i][1] = data[i][1];
        int k = i+1;
        int v = k;
        int t=0;
        for(int j=0;j<data.length-v;j++) {
            System.out.println("Inner for loop" + j);
            String s = data[k][0];
// line 42:
            if(firstAlphabet[i][0].compareToIgnoreCase(s.substring(0, 1))==0) { 
               System.out.println("If statement");
               firstAlphabet[i][0] = s.substring(0, 1);
               Integer z = Integer.parseInt(data[k][1]) + Integer.parseInt(firstAlphabet[i][1]);
               firstAlphabet[i][1] = z.toString();                   
            }
            k++;
        }   
    }               
  }catch(Exception exc) {
     exc.printStackTrace();
   }
}

public static void main(String args[]) {
    ArrayTester o = new ArrayTester();
    o.calculator();
    for(String s[] : firstAlphabet) {
        for(String x : s) {
            System.out.println(x);
        }
    }
}
}

出力

Inner for loop0

Inner for loop1

If statement

Inner for loop2

Inner for loop3

Inner for loop4

Inner for loop5

If statement

Inner for loop6

Inner for loop7

If statement

Inner for loop0

Inner for loop1

Inner for loop2

Inner for loop3

If statement

Inner for loop4

Inner for loop5

Inner for loop6

Inner for loop0

Inner for loop1

Inner for loop2

Inner for loop3

If statement

Inner for loop4

Inner for loop5

If statement

Inner for loop0

If statement

Inner for loop1

Inner for loop2

Inner for loop3

Inner for loop4

Inner for loop0

Inner for loop1

Inner for loop2

Inner for loop3

Inner for loop0

Inner for loop1

Inner for loop2

Inner for loop0

Inner for loop1

If statement

Inner for loop0

N

226

null

null

null

null

null

null

null

B

36

null

null

null

null

null

null

null

N

219

null

null

null

null

null

null

null

A

40

null

null

null

null

null

null

null

A

21

null

null

null

null

null

null

null

B

35

null

null

null

null

null

null

null

N

209

null

null

null

null

null

null

null

z

100

null

null

null

null

null

null

null

N

9

null

null

null

null

null

null

null

アルファベットに関連付けられている合計が正しいことに気付いた場合。唯一の問題は繰り返しです。つまり、たとえばN = 219、つまり200 + 19

4

3 に答える 3

1

すでに選択されているアルファベットをダーティとしてマークしないと、繰り返しが発生します。

したがって、最初のループ自体でNは最終カウントを取得しますが、Nimbusが反復状態になったときの現在のロジックでは、Nをダーティとしてマークしていないため、処理全体を実行します。

public void calculator() {
        List<String> marked = new ArrayList<String>();
        try {
            // traverse the whole array
            firstAlphabet = new String[data.length][2]; // set the length of first Alphabet array
            for (int i = 0; i < data.length; i++) {
                String firstLetter = data[i][0].substring(0, 1);
                if(marked.contains(firstLetter)){
                    continue;
                }
                marked.add(firstLetter);
                firstAlphabet[i][0] = firstLetter; // get the first alphabet
                firstAlphabet[i][1] = data[i][1];
                int k = i + 1;
                int v = k;
                int t = 0;
                for (int j = 0; j < data.length - v; j++) {
                    System.out.println("Inner for loop" + j);
                    String s = data[k][0];
                    if (firstAlphabet[i][0].equalsIgnoreCase(s.substring(0,
                            1))) { // line 42
                        System.out.println("If statement");
                        firstAlphabet[i][0] = s.substring(0, 1);
                        Integer z = Integer.parseInt(data[k][1])
                                + Integer.parseInt(firstAlphabet[i][1]);
                        firstAlphabet[i][1] = z.toString();
                    }
                    k++;
                }
            }
        } catch (Exception exc) {
            exc.printStackTrace();
        }
    }
于 2012-05-25T10:45:23.593 に答える
0

基本的にあなたができることは次のとおりです。

// words is an array of tuples (word, frequency); that should probably be a class in your java code
// sums is a HashMap<Character, Integer>
foreach word, frequency in words:
     letter = word[0]
     sums[letter] = sums[letter] + frequency

Javaで書くのは簡単で、現在のコードよりも速くて簡単なはずです。あなたがしなければならない唯一のことはsums[letter]、それを初期化しない場合、すでに存在するかどうかをチェックするfrequencyことです-JavaがそのようなもののためにDefaultDictを提供しないのは残念です。

于 2012-05-25T10:45:11.207 に答える
0

あなたは出来る:

  1. など、より便利なデータ構造を使用しますMap<Character, Integer>
  2. データ構造の変更が適切でない場合は、カスタムを使用して、反復を開始する前に入力配列を並べ替えることもできますComparator。見るArrays.sort()

    Arrays.sort(data, new Comparator<String[]>() {
        public int compare(String[] o1, String[] o2) {
            Character letter1 = o1[0].charAt(0);
            Character letter2 = o2[0].charAt(0);
            return letter1.compareTo(letter2);
        }
    });
    
于 2012-05-25T11:02:16.327 に答える