2013-12-14 2 views

ответ

1

Является ли проблема, что ваш «newCount» является String вместо Integer?

 String newCount = entry.getValue().toString(); 
     if(topN.containsKey(entry.getKey())){ 
      newCount += topN.get(entry.getKey()); 
     } 
+0

Это не должно быть «Integer»; это должно быть «Актер», в соответствии с определением карты, но это было бы причиной того, что «put» выбрасывает ошибку. – Josh

+0

о, добра, да. Спасибо, @SpacePope! Честно говоря, я не совсем уверен, что любой из типов * должен быть ... не должен ли парсер читать актеров и эскизов (обе строки, может быть?), А затем перебирать их, чтобы обновить карту актеров и счетчиков (string + integer), затем взять верхние N записей в этой карте, отсортированные по значению? –

+0

Да ...для некоторых вопросов о SO вы можете только разумно ожидать решения одной проблемы за раз. :) – Josh

0

С линией Parser parser; вы объявляете переменную своего класса Parser, но не инициализировать эту varialbe. Вместо этого используйте Parser parser = new Parser();.

Там также, как представляется, в целом много проблем типа вдоль линий

String newCount = entry.getValue().toString(); 
if(topN.containsKey(entry.getKey())){ 
    newCount += topN.get(entry.getKey()); 
} 
topN.put(entry.getKey(), newCount); 

Похоже, что вы хотите, чтобы сложить счетчики, но это не будет работать, если вы преобразовать Integer в String первый ! Кроме того, key из Entry будет иметь значение, так topN никогда не может содержать этот ключ, так как это Map из Strings и Actors, и даже если это было бы, как бы вы добавить Actor к Integer (или String)? Наконец, как отмечали другие, put завершится с ошибкой, так как тип ключа и значение не соответствуют типам Map.

не зная, что эти другие классы (Sketch, Value, Actor и т.д.) делают, это очень трудно сделать дать четкий совет, как решить вашу проблему.

+0

Я не думаю, что у меня будет место для всех кодов, и теперь я получаю ошибку форматирования кода, чтобы опубликовать все соответствующие классы. – George

+0

Не нужно публиковать все классы, просто описывайте, что они делают. В частности, что такое «Эскиз» и «Ценность» и каково их отношение к «Актеру»? –

+0

Публичный класс ApproxCount . Значение является общим. Эскиз - это внутренний класс для ApproCount – George

0

topN заявлено как Map<String, Actor>. Таким образом, ключ должен быть String, а значение должно быть типа Actor.

В topN.put(entry.getKey(), newCount);, newCount (a String) не является Actor. Также проверьте, является ли строка entry.getKey().

public class Parser { 

     private BufferedReader bf; 
     private static final String ACTOR_MOVIE_FILE = "actormovie.txt"; 
     private Map<String, Actor> actors; 

     //this is the input file size 
     int fileSize = ACTOR_MOVIE_FILE.length(); 

     public Parser() { 
       try { 
         bf = new BufferedReader(new FileReader(ACTOR_MOVIE_FILE), 32768); 
       } catch (FileNotFoundException e) { 
         JOptionPane.showMessageDialog(null, "file cannot be located ", "File not found exception", JOptionPane.ERROR_MESSAGE); 
       } 
       actors = new Hashtable<String, Actor>(1713251); 
     } 

     /** 
     * this reads data on a line one at a time 
     * @return actors in the hash table, with the name of an actor as a, 
     * and value as the actor object 
     */ 
     public Map<String, Actor> readLines() { 
       String line=" "; 

       while(true){ 
         try { 
           line = bf.readLine(); 
         } catch (IOException e) { 
           JOptionPane.showMessageDialog(null, "deadlock file not in proper format", "we have error reading the file", JOptionPane.ERROR_MESSAGE); 
         } 

         if(line == null){ 
          break; 
          } 

         String[] tokens = line.split("/");   
         assemblyLines(tokens); 
       } 
       try { 
        bf.close(); 

       } catch(IOException e){ 

       } 
       return actors; 
     } 

     /** 
     * from a line we get stringTokenizers parse to the data structures. Film is described as a 
     * stringTokenizer with film object created from it. There are actors which are as well 
     * stringTokenizers created as actor object 
     * there is an actor table that controls entry space. In occurrences of other actors , 
     * the object is altered, other than that 
     * objected is created and appended to the table 
     * @param stringTokenizer makes the text file divided into individual components 
     */ 
     public void assemblyLines(String[] stringTokenizer){ 
       Film film = new Film(stringTokenizer[0]); 

       for(int i = 1; i < stringTokenizer.length;i++){ 

         Actor actor; 
         String actorName = stringTokenizer[i]; 

         if(actors.containsKey(actorName)){       
           actor = actors.get(actorName); 
         } else { 
           actor = new Actor(actorName); 
           actors.put(actorName, actor); 
         } 
         film.addActor(actor); 
         actor.addFilm(film); 
       } 
     }   

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