Частота значений 2D Array - PullRequest
0 голосов
/ 15 мая 2010

Если у меня есть 2D-массив, который расположен следующим образом:

  String X[][] = 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"}
                                   };

Я хочу знать частоту каждого значения .. поэтому I27.0.0.9 получает 2. Как я могу сделать общее решение для этого? В Java или любой алгоритм для любого языка?

Ответы [ 4 ]

3 голосов
/ 15 мая 2010

Похоже, вам нужен пользовательский тип данных для инкапсуляции каждой строки вместо использования 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; }
//...
1 голос
/ 15 мая 2010
// I think this is an example of what Vodkhang is describing

public static void main(String[] args){
  String X[][] = 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 = X.length;
   final int N = X[0].length;

   HashMap<Object, ArrayList> map = new HashMap();

   for(int i = 0; i < M; i++){
       for(int j = 0; j < M; j++){
           String s = X[i][j];
           if( map.containsKey(s) ){
               // add the string to the existing array list
               ArrayList al = map.get(s);
               al.add(s);
               map.put(s,al);
           } else {
               // make a new node
               ArrayList al = new ArrayList();
               al.add(s);
               map.put(s, al);
           }
       }
   }

   // now loop through each pair in the map
   // for each arraylist print out the size
   Set<Object> set = map.keySet();
   for(Object s: set){
       ArrayList al = map.get(s);
       System.out.println(s.toString() + " " + al.size() );
   }

}

1 голос
/ 15 мая 2010

Не храните все как строки. Это замедляет обработку и не элегантно. Зачем хранить номер порта (который является int) в виде строки? или логическое значение "хорошо" "плохо" в виде строки? Создайте пользовательский класс, у которого есть поля с типами, соответствующими их семантике.

1 голос
/ 15 мая 2010

Вы можете использовать Map для Java как вопрос выше, используйте словарь для C # Общий алгоритм состоит в том, что у вас есть таблица / массив ключ-значение. И вы можете дать ключу структуры данных, он найдет для вас правильное значение для этого ключа

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...