2015-04-24 2 views
0

Я хочу, чтобы эта программа сортировала беспорядочные слова в алфавитном порядке, сравнивалась со словарем и соответствовала словарным словам. Я получаю его, чтобы распечатать мелодии в алфавитном порядке, но он не будет печатать словарные слова, даже если у меня есть линия печати.Почему моя печатная линия не работает?

public class i 
{ 
public static void main(String[] args) throws Exception 
{ 
    if (args.length < 2) die("No dictionary"); 

    BufferedReader dictionaryFile = new BufferedReader(new FileReader(args[0])); 
    BufferedReader jumbleFile = new BufferedReader(new FileReader(args[1])); 


    HashMap<String, ArrayList<String>> map = new HashMap<String, ArrayList<String>>(); 
    ArrayList<String> jumbleWords = new ArrayList<String>(); 
    ArrayList<String> dictionaryWords = new ArrayList<String>(); 

    while(dictionaryFile.ready()) 
    { 
     String dictWord = dictionaryFile.readLine(); 
     dictionaryWords.add(dictWord); 
    } 

    while(jumbleFile.ready()) 
    { 
     String word = jumbleFile.readLine(); 
     //String canWord = toCanonical(word); 
     jumbleWords.add(word); 
     map.put(word, new ArrayList<String>()); 
    } 
    Collections.sort(jumbleWords); 

    for(String dictionaryWord : dictionaryWords) 
    { 
     String canDictWord = toCanonical(dictionaryWord); 
     if(map.containsValue(canDictWord)) 
     { 
      ArrayList<String> listOfWords = map.get(canDictWord); 
      listOfWords.add(dictionaryWord); 
     } 
    } 
     ArrayList<String> keysList = new ArrayList(map.keySet()); 
     Collections.sort(keysList); 
     for(String key : keysList) 
     { 
      System.out.print(key); 

      ArrayList<String> list = map.get(key); 
      Collections.sort(list); 
     for(String word : list) 
       { 
        if (toCanonical(key).equals(toCanonical(word))) 
        System.out.print(word + " "); 
       } 
      System.out.println(); 
     } 


} 

private static void die(String errmsg) 
{ 
      System.out.println("\nFATAL ERROR: " + errmsg + "\n"); 
      System.exit(0); 
} 

private static String toCanonical(String word) 
{ 
    char[] letters = word.toCharArray(); 
    Arrays.sort(letters); 
    return new String(letters);  
} 
} 
+2

Установите точку останова и выполните свой код. Скорее всего, вы не удовлетворены условиями. – BlackHatSamurai

ответ

2

Значение вашей карты определяется как тип ArrayList<String>, но в коде ниже, вы пытаетесь проверить, содержит ли регулярный String.

if(map.containsValue(canDictWord)) { 
    // ... 
} 

Это всегда возвращает ложь, так что причина вашей println не работает потому, что изображения карты значение ArrayList s всегда будет пустым.

Трудно понять, чего вы на самом деле пытаетесь достичь, а форматирование (или отсутствие этого) вашего кода делает его еще сложнее. Вероятно, вам следует попытаться сделать карту со словарными словами в виде ключей, а смешанные слова - списком значений. Затем вы можете использовать map.containsKey(toCanonical(jumbledWord)) и добавить беспорядочное слово в список значений для этого ключа.

+0

Я также попытался использовать 'containsKey()'. Означает ли это, что это только строка? @Robby – and129

+0

Поскольку ключи вашей карты имеют тип 'String', вы можете искать их таким образом. Однако вы, похоже, очень смущены логикой, к которой вы стремитесь здесь. Из чтения вашего кода мне трудно понять, что вы на самом деле пытаетесь сделать, что, в свою очередь, затрудняет мне дальнейшую помощь. –

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