2013-07-05 2 views
0

Привет ниже моя программа, которая отображает 10 наиболее часто происходящие слова, но мое требование, чтобы получить топ-30 часто встречающиеся слова,как увеличить количество наиболее часто встречающихся слов с использованием Java

class FrequencyCount { 
int[][] table = new int[4][1000000]; 
TreeMap<Integer, List<String>> map = new TreeMap<Integer, List<String>>(
      Collections.reverseOrder()); 
public static void main(String[] args) throws Exception { 
     FrequencyCount freq = new FrequencyCount(); 
     BufferedReader br = null; 
try { 

     br = new BufferedReader(new FileReader(new File(
       "C:/portable.pdf"))); 
     String fileline = br.readLine(); 
     System.out.println("fileline:" + fileline); 
     while (fileline != null) { 
      if (fileline.length() > 0) { 
       String[] sArr = fileline.split(" "); 
       for (String s : sArr) { 
        int flag = 1; 
        for (int j = 0; j < stopwords.length; j++) { 
         String s1 = s.toLowerCase(); 

        } 
        if (flag != 0) { 
         if (s.trim().length() > 0) { 
          try { 
           freq.add(freq.trimStr(s)); 
          } catch (ArrayIndexOutOfBoundsException e) { 

          } 
         } 
        } 
       } 
      } 
      fileline = br.readLine(); 
     } 

     Set<Integer> set = freq.map.keySet(); 
     for (Integer x : set) { 
      System.out.println(freq.map.get(x) + " found " + x + " times"); 
     } 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } finally { 
     br.close(); 
    } 
} 

public String trimStr(String s) { 
    if (s.toUpperCase().equals(s.toLowerCase())) { 
     return s; 
    } 
    s = s.toLowerCase().trim(); 

    if (s.endsWith("'s")) { 
     s = s.substring(0, s.length() - 2); 
    } 
    int i = 0; 
    int j = s.length() - 1; 
    char[] cArr = s.toCharArray(); 

    while (!(cArr[i] >= 65 && cArr[i] <= 90) 
      && !(cArr[i] >= 97 && cArr[i] <= 122)) { 
     i++; 
    } 

    while (!(cArr[j] >= 65 && cArr[j] <= 90) 
      && !(cArr[j] >= 97 && cArr[j] <= 122)) { 
     j--; 
    } 

    return s.substring(i, j + 1); 
} 

public int[] hash(String s) { 
    int h1 = hash1(s); 
    int h2 = hash2(s); 
    int h3 = hash3(s); 
    int h4 = hash4(s); 

    int[] res = new int[] { h1, h2, h3, h4 }; 
    return res; 
} 

public int hash1(String x) { 
    char ch[] = x.toCharArray(); 
    int i, sum; 
    for (sum = 0, i = 0; i < x.length(); i++) 
     sum += ch[i]; 
    return sum % 1000000; 
} 

public int hash2(String s) { 
    int h = 0; 
    for (int i = 0; i < s.length(); i++) { 
     h = 31 * h + s.charAt(i); 
    } 
    h = h % 1000000; 
    if (h < 0) { 
     h = -h; 
    } 
    return h; 
} 

public int hash3(String s) { 
    int h = 0; 
    for (int i = 0; i < s.length(); i++) { 
     h = 17 * h + s.charAt(i); 
    } 
    h = h % 1000000; 
    if (h < 0) { 
     h = -h; 
    } 
    return h; 
} 

public int hash4(String s) { 
    int h = 0; 
    for (int i = 0; i < s.length(); i++) { 
     h = 11 * h + s.charAt(i); 
    } 
    h = h % 1000000; 
    if (h < 0) { 
     h = -h; 
    } 
    return h; 
} 

public void add(String s) { 

    int[] h = hash(s); 
    table[0][h[0]] = table[0][h[0]] + 1; 
    table[1][h[1]] = table[1][h[1]] + 1; 
    table[2][h[2]] = table[2][h[2]] + 1; 
    table[3][h[3]] = table[3][h[3]] + 1; 
    int r = Math.min(Math.min(Math.min(table[0][h[0]], table[1][h[1]]), 
      table[2][h[2]]), table[3][h[3]]); 
    boolean add = true; 
    List<String> list = map.get(r); 
    if (list == null) { 
     if (map.size() == 10) { 
      Integer lastKey = map.lastKey(); 
      if (lastKey.intValue() > r) { 
       add = false; 
      } else { 
       map.remove(lastKey); 
      } 
     } 
     list = new ArrayList<String>(); 
    } 
    if (add) { 
     list.add(s); 
     map.put(r, list); 
     if (r > 1) { 
      list = map.get(r - 1); 
      if (list != null) { 
       if (list.size() == 1) { 
        map.remove(r - 1); 
       } else { 
        list.remove(s); 
       } 
      } 
     } 
    } 
} 

public int count(String s) { 
    int[] h = hash(s); 
    int a = table[0][h[0]]; 
    int b = table[1][h[1]]; 
    int c = table[2][h[2]]; 
    int d = table[3][h[3]]; 
    int r = Math.min(Math.min(Math.min(a, b), c), d); 
    return r; 
} 
} 

Я изменил карту размер до 30, но его не работает, пожалуйста, предложите мне, как получить 30 самых часто встречающихся слов.

Thanks

ответ

0

Я использовал бы другой подход. Я бы добавил вместо этого слово в HashMap и использовал строку в нижнем регистре в качестве ключа, а затем количество времени, которое оно произвело как значение. Когда вся карта создана, вы можете отсортировать ее как described here и отобразить любое число сверху, как вам нравится.

Основная идея:

HashMap<String, Integer> wordcounter = new HashMap<String, Integer>(); 

    if (wordcounter.containsKey(s)) 
     wordcounter.put(s, wordcounter.get(s) + 1); 
    else 
     wordcounter.put(s, 1); 
+0

можно получить n число часто встречающихся слов, используя мой код, если не я попробую эту процедуру, можете ли вы, пожалуйста, предложить мне. – user2545106

+0

Я не совсем уверен в этом. Вы заявили, что изменили размер карты на 30, но она не сработала. Вы также обновили эту строку в методе добавления? "if (map.size() == 10) {" В противном случае, я думаю, что это могло бы сделать трюк – user2545579

0

Существует только одно изменение слова от 10 до 30, как указано ниже.

public void add(String s) { 

    int[] h = hash(s); 
    table[0][h[0]] = table[0][h[0]] + 1; 
    table[1][h[1]] = table[1][h[1]] + 1; 
    table[2][h[2]] = table[2][h[2]] + 1; 
    table[3][h[3]] = table[3][h[3]] + 1; 
    int r = Math.min(Math.min(Math.min(table[0][h[0]], table[1][h[1]]), 
      table[2][h[2]]), table[3][h[3]]); 
    boolean add = true; 
    List<String> list = map.get(r); 
    if (list == null) { 
     if (map.size() == 30) {//Changed from 10 to 30 

      Integer lastKey = map.lastKey(); 
      if (lastKey.intValue() > r) { 
       add = false; 
      } else { 
       map.remove(lastKey); 
      } 
     } 
     list = new ArrayList<String>(); 
    } 
    if (add) { 
     list.add(s); 
     map.put(r, list); 
     if (r > 1) { 
      list = map.get(r - 1); 
      if (list != null) { 
       if (list.size() == 1) { 
        map.remove(r - 1); 
       } else { 
        list.remove(s); 
       } 
      } 
     } 
    } 
} 
+0

Я также изменяю размер карты 10-30, но ее не работает. – user2545106

+0

Также комментарий 3 строки // для (int j = 0; j

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