2017-10-31 15 views
-1

죄송합니다. 이것이 바보 같은 질문 인 경우, 나는지도 작업을 처음 접했습니다. Hashmaps : String List에 문자열을 추가하려고 시도했습니다.

static void learnFromText(Map<List<String>, List<String>> whatComesNext, List<String> text) { 
    List<String> maurice = new ArrayList<String>(); 
    List <String> wallace = new ArrayList<String>(); 
    List <String> romeo = new ArrayList<String>(); 
    for (int i=0; i<=text.size()-3; i++) { 
     maurice.clear(); 
     wallace.clear(); 
     maurice.add(text.get(i)); 
     maurice.add(text.get(i+1)); 
     if (whatComesNext.containsKey(maurice)==false) 
     whatComesNext.put(maurice, romeo); 
     wallace=whatComesNext.get(maurice); 
     wallace.add(text.get(i+3)); 
     whatComesNext.put(maurice, wallace); 
    } 
    } 

(I 완전히 내가 어떻게해야 무슨 오해 때문에 원래의 게시물의 대부분을 제거.)

나는 모든 키에 두 개의 연속 된 단어입니다 문자열 목록 키와 문자열 목록 값의지도를 가지고 String리스트의 "text" "text.subList (i, i + 2)"키를 찾을 때마다 text.get (i + 2)을 키 값에 추가해야합니다.

예를 들면.

텍스트의 요소는 [A, B, C, D, A, B, E, F]입니다.

  1. 키 (A, B)의 값은 (C)입니다.
  2. 키 (B, C)의 값은 (D)입니다.
  3. 키 (C, D)의 값은 (E)입니다.
  4. 키 (D, A)의 값은 (B)입니다.
  5. 키 (A, B)의 값은 (C, E)입니다.
  6. 키 (B, E)의 값은 (F)입니다.

코드의 문제는 어떻게 든 그것이 whatComesNext을 구성해야 할 텍스트의 크기에 대한는 ArrayIndexOutOfBoundsException를 반환한다는 것입니다.

+1

나는이 문제에 대해 잘못된 점을 지정하지 않고 여기에 코드를 게시 했으므로이 질문을 취소했습니다. 우리는 코드가 기대하는 바가 무엇인지, 왜 그렇게 할 것이라고 기대하는지, 실제로 무엇을하는지, 그리고 왜 잘못되었는지를 예상합니다. 제발이 정보를 포함하도록 질문을 편집 한 다음, 내 downvote를 철회하는 것을 고려할 것입니다. 참고 : [최소한의 완전하고 검증 가능한 예제를 만드는 방법] –

+0

코드 문제는 어떻게 든 텍스트의 크기에 대해 ArrayIndexOutOfBoundsException을 반환한다는 것입니다. whatComesNext를 생성해야합니다. – user2709168

+0

업데이트를 요청하고 계속 요청할 수 있습니까? 첨부 된 스레드를 읽고 코드에서 작은 오류가 발생했습니다. OutOfBoundsException을 제거 했으므로 이제는 코드가 모든 값을 null로 설정합니다. – user2709168

답변

1

clearList을 다시 만들 때 사용하지 않는 것이 문제입니다. 대신 코드에서 의 동일한 인스턴스를 Map의 모든 요소에 사용하고 있습니다. 그런 다음 clear을 실행하면 맵에서 모든 요소가 지워집니다.

최소 코드 수정은 다음과 같아야합니다.

static void learnFromText(Map<List<String>, List<String>> whatComesNext, List<String> text) { 
    List<String> maurice; 
    List <String> wallace; 
    for (int i=0; i<=text.size()-3; i++) { 
     maurice = new ArrayList<>(); 
     maurice.add(text.get(i)); 
     maurice.add(text.get(i+1)); 
     if (whatComesNext.containsKey(maurice)==false) 
     whatComesNext.put(maurice, new ArrayList<>()); 
     wallace=whatComesNext.get(maurice); 
     wallace.add(text.get(i+2)); 
     whatComesNext.put(maurice, wallace); 
    } 
} 
+0

그래서 모리스를 새로운 ArrayList 으로 초기화하면 모든 키가 동적으로이를 참조하므로 키를 지울 수도 있습니다. 그러나 명시 적으로 모리스를 초기화하지 않음으로써, 모리스를 지울 때마다 새로운 별도의 목록을 만듭니다. – user2709168

+0

맞아요, 키와 값이 다른 인스턴스에 있어야합니다. 나는 그것을 간과했으며,'maurice'는'containsKey' 호출에만 사용되었다고 생각했습니다. 나는 또한 각 루프에 새로운 인스턴스를 만들기 위해 mauirce를 편집했다. – Alex