2014-02-12 2 views
1

여기에서 매우 새로운 형식이므로 실수를해서 실례합니다. 나는 자바 어사이션을 가지고 있는데, 사전 적으로 문자열을 쓰지 않고 스캐너에서 주어진 단어보다 큰 사전 적 최하위 단어를 찾아야 만한다. 이 예제에서 주어진 단어는 "am"입니다. 아래 코드를 작성했지만이 질문의 끝에서 설명 할 문제가 있습니다.Java - 사전 편집 순서로 다음 단어 찾기

public static void main (String[] args){ 
    Scanner s = new Scanner("I am very happy with life"); 

    String high = ""; 
    String o = "am"; 
    String curr = ""; 

    while (s.hasNext()){ 
     curr = s.next(); 
     if (curr.compareTo(high) > 0) 
      high = curr; 
    } 

    Scanner ss = new Scanner("I am very happy with life"); 

    while (ss.hasNext()){ 
     curr = ss.next(); 
     if (curr.compareTo(high) < 0 && curr.compareTo(o) > 0) 
      high = curr; 
    } 

    System.out.println(high); 
}} 

내 문제는 다음과 같습니다 내가 메인의 절차를 가진보다는 계산을 수행하는 방법을 작성해야합니다. 또한 스캐너를 한 번 사용해야하고 동일한 값을 가진 다른 스캐너를 초기화 할 수 없습니다.

이 코드는 정상적으로 작동하지만 단일 기능 루프 메서드로 변환하는 데 가장 힘든 시간을 가지고 있습니다.

추신. 바보 같은 var 이름을 아쉽게 생각합니다. 이 같은

+1

스캐너에서 단어를 한 번만 가져와야합니다. 문제를 올바르게 이해하면 주어진 단어보다 큰 사전 편집용 최저 단어를 찾고 있습니다. 이것은 하나의 루프에서 수행 될 수 있습니다. – Henry

+0

그건 내가해야 할 일입니다. 그러나 나는 기능적인 루프를 작성하면서 가장 힘든 시간을 보내고있다. – JungleJeem

+0

나는 스스로 발견한다면 더 많은 것을 배울 것이므로 완전한 해결책을 포기하지 않으려 고 노력한다. 다르게 표현하겠습니다. 주어진 단어보다 큰 모든 단어 중에서 최소를 찾고 있습니다. – Henry

답변

2

뭔가 (A TreeSet 사용)하십시오 TreeSet없이

import java.util.Scanner; 
import java.util.TreeSet; 

public class LexicographicScanner { 

    private final TreeSet<String> words = new TreeSet<String>(); 

    public LexicographicScanner(final Scanner scanner) 
    { 
     while (scanner.hasNext()) 
     { 
      words.add(scanner.next()); 
     } 
     scanner.close(); 
    } 

    public String nextWord(final String word) 
    { 
     return words.higher(word); 
    } 

    public static void main(String[] args) { 
     final LexicographicScanner ls 
      = new LexicographicScanner (new Scanner("I am very happy with life")); 

     System.out.println(ls.nextWord("am")); 
     System.out.println(ls.nextWord("I")); 
     System.out.println(ls.nextWord("with")); 
    } 
} 

출력

happy 
am 
null 

편집

:

public class LexicographicScanner { 

    public static String nextWord(final Scanner scanner, final String word) 
    { 
     String higher = null, curr; 
     while (scanner.hasNext()) 
     { 
      curr = scanner.next(); 
      if (curr.compareTo(word) > 0) 
      { 
       if (higher == null || curr.compareTo(higher) < 0) 
        higher = curr; 
      } 
     } 
     return higher; 
    } 

    public static void main(String[] args) { 
     final Scanner s1 = new Scanner("I am very happy with life"); 
     final Scanner s2 = new Scanner("I am very happy with life"); 
     final Scanner s3 = new Scanner("I am very happy with life"); 
     System.out.println(nextWord(s1, "am")); 
     System.out.println(nextWord(s2, "I")); 
     System.out.println(nextWord(s3, "with")); 
     s1.close(); 
     s2.close(); 
     s3.close(); 
    } 
} 
+0

문자열을 사전 식 순서로 넣을 수 없으므로 treeset을 사용할 수 없습니다. 나는 그것을 언급 했어야했다. 죄송합니다! – JungleJeem

+0

정말 고맙습니다. 완벽하게 작동합니다. 실제로 이해합니다. 너는 내 하루를 보냈다. 많은 사랑과 존경. – JungleJeem

1

힌트 :

String res = null; 
Scanner s = new Scanner(str); 
for each curr in s scanner { 
    if (curr greater than given 
      and (dont have res or curr is less than res)) { 
     res = curr; 
    } 
} 
+0

그래서 누군가가 나에게 답을주었습니다.하지만 정말 루프가 좋기 때문에 당신의 방법을 사용하려고했습니다! 하지만 어떻게 생각하세요? "s 스캐너의 각 curr에 대해"문장의 단어 수와 같은 정수를 초기화해야하기 때문에. 이를 위해서는 while 루프를 사용하여 해당 번호를 찾아야합니다. 그리고 더 이상 단어가 없기 때문에 s.next()를 사용할 수 없습니다. 이 솔루션은 두 가지 방법으로 수행 할 수 있습니다. 맞습니까? – JungleJeem

+1

@JungleJeem nonono no. 나는 'for every word'를 의미했지만 for 루프는 사용할 필요가 없다. 더 나은 사용하는 동안. 두 단계의 솔루션이 있었고 복합 기준을 사용하여 단일 루프에서 이러한 루프를 결합하는 방법을 제안했습니다. 주어진 단어보다 큰 단어를 찾으십시오. 그러나 지금까지 발견 된 단어보다 적습니다. 당신은 그 시점까지 최고의 단어를 가지고 있어야합니다. – aalku

+0

이 좋습니다. 그러나 이것은 다른 질문으로 나를 데려옵니다 : 이미 문자열의 끝에 도달하고 또 다른 방법을 쓰고 싶지 않으면 어떻게 hasnext() 또는 next()를 반복 할 수 있습니까? – JungleJeem

2

먼저 할 몇 가지 요구 사항 :

  1. 내가 찾고 있어요 단어 내가 찾고 있어요 단어가 가장 낮은 사전 식이다
  2. 내 입력 단어 이상의 사전 식 높다 가능

그래서 기본적으로 입력 된 단어 fo r 단어를 읽고 두 가지 요구 사항을 확인하십시오. 여기에 약간의 의사 코드가 있는데, 이것이 을 이해하고 당신의 문제 /이 해결책을 이해하기를 바랍니다.

inputWord <= input 
currentlyHighest <= null 

for (word <= sentence) { 
    is word higher than inputWord? 
     no: discard word and analyze the next one 
     yes: go on 

    do i have a currently highest word? 
     no: save the word in currentlyHighest and analyze the next word 
     yes: go on 

    is word lower than currentlyHighest? 
     no: discard word and analyze the next one 
     yes: we have found a better match: save word in currentlyHighest and analyze the next one 
} 
+0

다시, 나는 그 문제를 이해한다. 그러나 당신은 "단어 <= 문장"을 한 가지 방법으로 만들어 낼 수 있습니까? – JungleJeem

+1

이것은 의사 코드이므로 코드에서이 부분에 대한 솔루션을 이미 사용했습니다. 그러나 정말로 주장한다면 다음과 같이 작성할 수 있습니다 : for (String word : sentence.split ("\\ s +")) {}' –