2010-05-15 10 views
0

나는 다음과 같이 배치 된 2 차원 배열이있는 경우 : I27.0.0.9 내가 할 수있는 방법 2. 얻을 수 있도록2 차원 배열 값 주파수

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

내가 각 값의 주파수를 알고 싶어 .. 이것에 대한 일반적인 해결책은 무엇입니까? 자바 또는 어떤 언어의 알고리즘?

답변

3

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 

주 : 각 행은 각 열에 대한 주파수 맵 여기


는 아이디어를 입증하는 조각이다 : 모든 열의 값을 혼합하는 데 신경 쓰지 않는다면 a 대신에 Map 하나만 있으면됩니다. 각 열에 하나씩 List<Map> 그러나 이것은 디자인을 더 나쁘게 만들 것입니다. String[][]으로 모든 것을 혼합하는 대신 사용자 정의 유형으로 각 행을 캡슐화해야합니다.

예를 들어 일부 열은 실제로는 enum이어야합니다. 값 - 당신은 위의 질문 자바에 대한지도를 사용하는 일반적인 알고리즘 C# 을 위해 사전을 사용할 수 있습니다

enum Protocol { UDP, TCP; } 
enum Condition { Good, Bad; } 
//... 
1

는 키의 테이블/배열을 가지고있다. 그리고 데이터 구조에 키를 줄 수 있습니다. 키의 올바른 값을 찾을 수 있습니다.

1

모든 것을 문자열로 저장하지 마십시오. 이렇게하면 처리가 느려지고 우아하지 않습니다. 포트 번호 (int)를 문자열로 저장하는 이유는 무엇입니까? 또는 부울 값 "좋은" "나쁜"문자열로? 해당 의미에 해당하는 형식의 필드가있는 사용자 지정 클래스를 만듭니다.

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

}