Похоже, вам нужен пользовательский тип данных для инкапсуляции каждой строки вместо использования String[][]
, но для более прямого ответа на ваш вопрос вы можете использовать Map<String,Integer>
для каждого столбца. Можно ожидать, что HashMap<String,Integer>
сделает это в оптимальное время.
Вот фрагмент для демонстрации идеи:
import java.util.*;
public class Frequency {
static void increment(Map<String,Integer> map, String key) {
Integer count = map.get(key);
map.put(key, (count == null ? 0 : count) + 1);
}
public static void main(String[] args) {
String table[][] = new String[][] {
{"127.0.0.9", "60", "75000","UDP", "Good"},
{"127.0.0.8", "75", "75000","TCP", "Bad"},
{"127.0.0.9", "75", "70000","UDP", "Good"},
{"127.0.0.1", "", "70000","UDP", "Good"},
{"127.0.0.1", "75", "75000","TCP", "Bad"}
};
final int M = table.length;
final int N = table[0].length;
List<Map<String,Integer>> maps = new ArrayList<Map<String,Integer>>();
for (int i = 0; i < N; i++) {
maps.add(new HashMap<String,Integer>());
}
for (String[] row : table) {
for (int i = 0; i < N; i++) {
increment(maps.get(i), row[i]);
}
}
for (Map<String,Integer> map : maps) {
System.out.println(map);
}
System.out.println(maps.get(0).get("127.0.0.9"));
}
}
Это дает следующий вывод: каждая строка является частотной картой для каждого столбца:
{127.0.0.9=2, 127.0.0.8=1, 127.0.0.1=2}
{=1, 60=1, 75=3}
{75000=3, 70000=2}
{UDP=3, TCP=2}
{Good=3, Bad=2}
2
Примечание: если вам не нужно смешивать значения из всех столбцов вместе, тогда вам нужен только один Map
вместо List<Map>
для каждого столбца. Это сделало бы дизайн еще хуже, хотя. Вы действительно должны инкапсулировать каждую строку в пользовательский тип, вместо того, чтобы смешивать все как String[][]
.
Например, некоторые из этих столбцов действительно выглядят так, как будто они должны быть enum
.
enum Protocol { UDP, TCP; }
enum Condition { Good, Bad; }
//...