2013-06-13 2 views
2

현재 anagram solver에서 작업 중입니다. 비교하기 전에 사용자 입력과 사전 목록의 글자를 알파벳순으로 정렬하는 것이 좋습니다. 그것은 재미있어 보였으므로 나는 그것을 시험해보고있다. 이전에는 순열 (permutations)을 사용 했었지만, 다중 단어 분석을 해결하기 위해 결국에는 (그리고 효율적으로) 사용할 수있는 무언가를 원합니다.Anagrams의 두 목록 비교 - Java

내 사용자 입력과 사전을 모두 문자 배열로 정렬하고 사전 순으로 정렬 할 수 있습니다. 이제 각각을 비교할 필요가있어서 어떤 것이 아나 그램인지 아닌지를 판단 할 수 있습니다. 알파벳순 사용자 입력을 받고 알파벳순 사전에 포함되어 있는지 여부를 판단하는 방법에 대해 생각했습니다. 아래 코드를 게시했습니다. 당신이 짐작할 수 있듯이 나는이 과정의 논리에 대해 약간 혼란 스럽다. 나는 누군가가 논리를 조금씩 교정 할 수 있는지 궁금해하고 있었다. 어떤 도움을 주셔서 감사합니다.

public class AnagramSolver1 { 

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

     List<String> dictionary = new ArrayList<String>(); 
     List<String> inputList = new ArrayList<String>(); 
     BufferedReader in = new BufferedReader(new FileReader("src/dictionary.txt")); 
     String line = null; 
     Scanner scan = new Scanner(System.in); 

     while (null!=(line=in.readLine())){ 
      dictionary.add(line); 
     } 
     in.close(); 

     char[] sortDictionary; 
     char[] inputSort; 

     System.out.println("Enter Word: "); 

     String input = scan.next(); 
     inputList.add(input); 

     //Getting a little confused here. I thought about sorting my input 
     //then iterating through my dictionary (while sorting it too) and comparing 
     //thus far it produces nothing 
     for(int i = 0; i < inputList.size(); i++){   
      inputSort = inputList.get(i).toCharArray(); 
      Arrays.sort(inputSort); 

      for (int j = 0; j < dictionary.size(); j++) { 

       sortDictionary = dictionary.get(i).toCharArray(); 
       Arrays.sort(sortDictionary); 

       if(inputSort.equals(sortDictionary)){ 
        System.out.println("Anagram" +dictionary.get(i)); 
       } //end if 

      }//end for 

     }//end for 

    }//end main 
} 

답변

1

여기에 한 번에 너무 많은 일을하고 있습니다. 파일 IO, 사용자 입력, 정렬 및 알고리즘을 모두 한 곳에서가집니다. 모듈화하여 isAnagram(List<Character> firstPhrase, List<Character> secondPhrase)이라는 기능을 갖도록하십시오. 제대로 작동하는지 확인한 다음 다른 모든 단계에서 호출 방법을 찾아야합니다. 이렇게하면 사용자 입력을 요구하지 않고 알고리즘을 테스트 할 수 있습니다. 이것은 훨씬 더 빠른 피드백 루프가 될 것입니다.

이 알고리즘은 다음과 같이 작동합니다입니다 :

  1. 자신의 길이를 비교 입력을 변이하지 않도록 (선택적으로) 입력의 내용을 복사합니다. 동등하지 않은 경우 false를 반환합니다.
  2. 각 목록을 정렬합니다.
  3. 요소를 반복하고 요소가 같은지 확인합니다. 그렇지 않은 경우 거짓을 반환합니다.
  4. 끝에 도달하면 true를 반환합니다.
+0

좋은 제안처럼 들리지만, 좀 더 생각해 봅시다. – David

2

정렬 문자 스트링을 해당 애너그램 인 문자열 세트에 맵핑하는 Map<String, Set<String>>을 유지 보수하지 않는 이유는 무엇입니까? 사전에서 단어를 읽을 때지도를 업데이트 할 수 있습니다. 예를 들어 단어 dog을 읽으면 "dgo" => {"dog"}에 항목을 추가합니다 (dgo은 단어 dog의 정렬 된 문자로 구성됩니다). 그런 다음 단어 god을 읽는 경우 문자를 정렬하여 동일한 dgo을 얻고 결과적으로 이전 항목을 "dgo" => {"dog", "god"}으로 수정합니다. 물론 사전에있는 모든 단어에 대해이 작업을 반복하십시오.

이렇게하면 빠르고 쉽게 쿼리 할 수 ​​있습니다. 단어 dog의 anagram을 찾으려면 map.get(sortChars("dog"))을 사용하십시오.

또 다른 메모에서 나는 다른 대답이 언급 한 것을 반복 할 것입니다. 즉, 코드를 모듈화하는 것이 중요합니다. 한 곳에서 모든 것을하는 것과는 반대로 논리적으로 관련된 함수/태스크를 자신의 메소드에 넣어야합니다. 이것은 미래의 코드를 유지 관리하는 가독성 및/또는 다른 사람들의 능력에 도움이됩니다.

+0

감사하지만 질문이 있습니다. 사전과 관련하여 이것이 어떻게 작동할까요? – David

+0

@dave 앞서 설명한 과정을 통해 사전에 전체 사전을로드합니다. – arshajii

+0

감사. 이것에 대해 좀 더 생각해 봅시다. – David