2013-07-30 5 views
-1

У меня есть массив с несортированными строковыми строками, и я хотел бы «преобразовать» его в 2D-массив, содержащий каждую запись из старого массива и количества (количество каждого появления строки) для этой записи.От массива 1D до двумерного массива с численностью

Я понятия не имею, как это сделать в Java, и я не уверен, что это хороший способ сделать это, потому что массив имеет записи 90k +.

+6

Я понятия не имею, что вы подразумеваете под изобилием для записи в массиве. –

+0

@JackManey Вероятно, подсчет каждого элемента. –

+0

Почему вы не используете базу данных для этой большой части данных – exexzian

ответ

2

Я предлагаю использовать карту:

Map<String, Integer> counted = new HashMap<String, Integer>(); 

for (String s : theOriginalArray) { 
     Integer count = counted.get(s); 
     if (count == null) { 
      counted.put(s, 1); 
     } else { 
      counted.put(s, count + 1); 
     } 
} 
+1

Вместо вызова 'get' для каждого элемента массива, вы должны использовать' containsKey', чтобы проверить, существует ли он на карте, и только вызывать 'get' для обновления записи, если она существует. – arshajii

+0

@arshajii 'containsKey()' работает по существу тем же самым кодом, что и 'get()', поэтому это будет означать в два раза работу – kiheru

+0

@kiheru 'containsKey()' возвращает логическое значение и 'get()' возвращает объект – pad

1

Что-то вроде этого?

Я сделал это со списком и картой, но вы можете легко преобразовать массив в список, и с ним проще работать.

public static Map<String, Integer> getUniqueStrings(List<String> rawData) { 
    Map<String, Integer> uniques = new HashMap<String, Integer>(); 

    for(String s : rawData) { 
     if(uniques.containsKey(s)) { 
      uniques.put(s, uniques.get(s) + 1); 
     } else { 
      uniques.put(s, 1); 
     } 
    } 

    return uniques; 
} 

Конечно, для записей 90K это займет некоторое время.

1

Это проблема студента? Если нет, вы можете использовать консервированное решение, подобное тому, которое предоставлено Google Guava.

import com.google.common.collect.HashMultiSet; 
import com.google.common.collect.MultiSet; 
// ... 
String[] stringArray = ...; 
MultiSet<String> bag = HashMultiSet.create(); 
Collections.addAll(bag, stringArray); 
int sos = bag.count("Stack Overflow");