2014-11-16 3 views
0

Привет, я пытаюсь получить все узлы, которые я создаю в pq, поэтому я могу упорядочить их по весу, а затем удалить первые два элемента (самый маленький), чтобы я мог построить дерево huffman которая является специализированной версией двоичного дерева, как лучший способ сделать это? БлагодаряВставка узлов в очередь приоритетов java

public class Main { 

    public void main(String[] args) throws IOException { 

     long start = System.currentTimeMillis(); 
     String inputFileName = args[0]; 
     FileReader reader = new FileReader(inputFileName); 
     Scanner in = new Scanner(reader); 

     // read in the data and do the work here 
     // read a line at a time to enable newlines to be detected and allowed for 

     while(in.hasNext()){ 
      CharacterMap<Character, Integer> hashMap = new CharacterMap<Character, Integer>(); 
      char[] chars = scanner.nextLine().toLowerCase().toCharArray(); 
      int c_count = 0; 
      for (Character c : chars) { 
       c_count += 1; 
       if (hashMap.containsKey(c)) { 
        hashMap.put(c, hashMap.get(c) + 1); 
       } else { 
        hashMap.put(c, 1); 
       } 
     } 

      PriorityQueue<Node> pq = new PriorityQueue<Node>(new Comparator<Node>() { 

      for (Map.Entry<Character, Integer> entry : hashMap.entrySet()){ 

       Node n = new Node(); 

       int f = entry.getValue(); 
       String c = entry.getKey(); 
       n.setWeight(f); 
       n.setCharacter(c); 

       n.setLeftChild(null); 
       n.setRightChild(null); 
       pq.add(n); 
      } 

     reader.close(); 

     String outputFileName = args[1]; 
     FileWriter writer = new FileWriter(outputFileName); 
     writer.write("Input file " + inputFileName + " Huffman algorithm\n\n"); 

     // write out the results here 

     long end = System.currentTimeMillis(); 
     writer.write("\nElapsed time: " + (end - start) + " milliseconds"); 
     writer.close(); 
    } 

} 
+0

Возможно, вы сделали это уже при быстрой проверке кода. Что за вопрос? – EJP

+0

Как только я их добавлю, я не уверен, как получить очередь, чтобы упорядочить их по весу. Одна из переменных экземпляра узлов. –

ответ

0

Если вы хотите, чтобы получить реализацию Java в приоритетной очереди, чтобы заказать узлы вес, вы должны сделать свой класс узел реализации «сопоставимый» интерфейс. Это означает, что вы применяете метод compareTo в своем классе узлов и определяете сравнение по весу, например:

private static class Node implements Comparable<Node>{ 
    public int compareTo(Node n) { 
     if(this.weight < n.weight){ 
      return -1; 
     }else if(this.weight > n.weight){ 
      return 1; 
     }else 
      return 0; 
    } 
} 
+0

. Спасибо, будут ли узлы автоматически вставлены в порядке веса, когда я сделаю pq.add (n)? так что я могу просто сделать pq.remove(), чтобы получить наименьший вес? –

+0

Да, это так. Выполнение Java приоритетной очереди на самом деле - это [Heap] (http://en.wikipedia.org/wiki/Heap_%28data_structure%29). Поэтому, когда элемент добавляется, он сравнивается с его родителем/дочерним элементом и «пузырится» с правильной позицией. – Highway62

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