0

次のコードは、重複する名前を 1 列に分割し、名前に関連付けられた数値の合計を 2 列目に分割します。

お気に入り :

   Nokia 21

   Blackberry 3

   Nimbus 30

プログラムで指定された配列から。


これらのエントリを含む配列の最終的な長さを知りたいです。この場合 3. どのように計算するのですか?

package keylogger;
import java.util.ArrayList;
import java.util.List;

public class ArrayTester {

private static int finalLength = 0;
private static String Name[][];
private static String data[][] = { 
                               {"Nokia" , "7"},
                               {"Blackberry" ,"1"},
                               {"Nimbus","10"},
                               {"Nokia" , "7"},
                               {"Blackberry" , "1"},
                               {"Nimbus","10"},
                               {"Nokia" , "7"},
                               {"Blackberry" , "1"},
                               {"Nimbus","10"}

                          };  

public void calculator() {

    Name = new String[data.length][2];
    List<String> marked = new ArrayList<String>();
    try {
        for(int i=0;i<data.length;i++) {
            Name[i][0] = data[i][0];
            Name[i][1] = data[i][1];
            String name = data[i][0];
            if(marked.contains(name)) {

                continue;
            }
            marked.add(name);
            int k = i + 1;
            int v = k;
            for (int j = 0; j < data.length - v; j++) {
                String s = data[k][0];
                if(Name[i][0].equalsIgnoreCase(s)) {
                    Name[i][0] = s;
                    Integer z = Integer.parseInt(Name[i][1]) + Integer.parseInt(data[k][1]);
                    Name[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[] : Name) {
        for(String x : s) {
            System.out.println(x);
        }
    }
}

}

4

3 に答える 3

2

アプリオリにそれを知ることはできません。サイズは、文字列の分割と計算が完了するとすぐにわかります。

あなたの例では、最終的marked.size()には探しているサイズになりますが、線形時間で既存の要素を検索してから配列に変換することを気にしないように、HashMap を直接使用することをお勧めします。

何かのようなもの:

String[][] names = new String[map.size()];
Set<String> keys = map.keys();
int c = 0;

for (String k : keys)
{
  names[c] = new String[2];
  names[c][0] = k;
  names[c++][1] = map.get(k).toString();
}
于 2012-05-25T12:55:58.177 に答える
2

いつものように、「問題」は不十分なコーディングです。適切に記述されたプログラム全体は、わずか 3 行のコードに減らすことができます (配列の定義と出力の出力を含める場合は 5 行)。

public static void main(String[] args) {
    String data[][] = {{"Nokia", "7"}, {"Blackberry", "1"}, {"Nimbus", "10"},
        {"Nokia", "7"}, {"Blackberry", "1"}, {"Nimbus", "10"}, {"Nokia", "7"},
        {"Blackberry", "1"}, {"Nimbus", "10"}, {"Zebra", "78"}};

    HashMap<String, Integer> totals = new HashMap<String, Integer>();
    for (String[] datum : data)
        totals.put(datum[0], new Integer(datum[1]) + (totals.containsKey(datum[0]) ? totals.get(datum[0]) : 0));
    System.out.println("There are " + totals.size() + " brands: " + totals);
}

出力:

There are 4 brands: {Nimbus=30, Zebra=78, Nokia=21, Blackberry=3}
于 2012-05-25T13:10:52.757 に答える
2

私が理解している限りでは、 を呼び出さずに配列内の個別の名前の数を知りたいと思いますよcalculator()ね? それでもすべてのエントリを調べてセットと比較する必要があるため、それが理にかなっているのかどうかはよくわかりません. しかし、あなたはセットでそれを行うことができます:

private int getNumberOfEntries(String[][] data) {
  Set<String> names = new HashSet<String>();
  for (int i=0; i<data.length; i++) {
    names.add(data[i][1]);
  }
  return names.size();
}

今すぐ電話することができますint n = getNumberOfEntries(data);...

編集:もちろん、同じステップで合計を行う方が理にかなっています。そのためのボヘミアンソリューションを参照してください。

于 2012-05-25T13:05:04.537 に答える