2012-05-25 5 views
0

Следующий код разделяет дублирующиеся имена на 1 столбец и сумму чисел, связанных с именами, во второй столбец.вычисление конечной длины

Как:

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); 
     } 
    } 
} 

}

+0

я не думаю, я понимаю. вы просто хотите проверить, сколько у вас разных имен? – piotrek

+0

@piotrek да ... –

+0

получить длину arrylist. –

ответ

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} 
+0

Что делать, если есть другой бренд _unique? Предположим, что есть один бренд под названием 'zebra 78'. В конце я хотел получить массив, содержащий уникальные бренды. –

+0

Я думаю, что это должно быть totalals.put (datum [0], totals.containsKey (datum [0])? Totals.get (datum [0]) + новое целое число (datum [1]): datum [1]); или totals.put (datum [0], datum [1] + totals.containsKey (datum [0])? totals.get (datum [0]): 0) – tibtof

+0

@ program-o-steve без проблем - он все еще работает , данные отредактированы, чтобы включить дополнительный бренд - см. отредактированный ответ и обновленный вывод – Bohemian

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(); 
} 
2

Насколько я понимаю, вы хотите знать количество различных имен в массиве, не вызывая calculator(), верно? Я действительно не знаю, имеет ли это значение, поскольку вам все равно придется проходить через каждую запись и сравнивать ее с набором. Но вы могли бы сделать это с помощью Set:

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); ...

EDIT: Конечно, это имеет смысл делать суммы в одном шаге см решение Богемианс для что.

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