2014-02-12 34 views
1

請原諒我的格式錯誤,因爲我在這裏很新。 我有一個Java任務,在這個任務中,我必須找到字典中最低的單詞,它大於掃描器給定的單詞,而不會將字符串按字典順序排列。在這個例子中,給定的單詞是「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); 
}} 

我的問題是: 我不得不寫,做計算,而不是在主程序的方法。此外,我必須使用掃描儀一次,並且無法使用相同的值初始化另一臺掃描儀。

此代碼工作正常,但我有最難的時候將其轉換爲單一的功能循環方法。

PS。對不起,愚蠢的var名稱。

+1

請注意,您只需從掃描儀中取一次字即可。如果我正確地理解了這個問題,那麼您正在尋找大於給定單詞的詞典最低單詞。這可以在一個循環中完成。 – Henry

+0

這正是我應該做的。然而,我正在經歷最困難的時期,寫一個功能循環。 – JungleJeem

+0

我儘量不要放棄完整的解決方案,因爲如果你自己發現它,你會學到更多。讓我用不同的方式來說明:在所有比所給單詞更大的單詞中,你正在尋找最小的單詞。 – Henry

回答

2

像這樣(使用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 

編輯

如果沒有TreeSet

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

所以有人給了我答案,但我試圖使用你的方法,因爲我真的很喜歡循環!但我想知道你會怎麼做呢? 「對於掃描器中的每個curr」因爲我必須初始化一個等於句子中單詞數量的整數。爲此,我必須使用while循環來查找該數字。然後我不能使用s.next(),因爲沒有剩下的單詞了。這個解決方案可以用兩種方法來解決,對嗎? – JungleJeem

+1

@JungleJeem nonono no。我的意思是'爲每個字',但你不需要使用for循環。更好地使用。你有兩個步驟的解決方案,我建議你如何以複合標準在單個循環中加入這些循環。只要找一個比給定的字更大的字,但比現在找不到的字更少。到目前爲止,你只需要傳達最好的詞彙。 – aalku

+0

這是有道理的。但是這帶來了另一個問題:如果我已經到達字符串的末尾並且不想寫另一個方法,我該如何重申hasnext()或next()? – JungleJeem

2

首先提出一些要求:

  1. 我尋找這個詞是不是我輸入字字典更高
  2. 我尋找這個詞的詞典最低可能

因此,基本上你必須走過你的輸入句子fo字和檢查這兩個要求。這裏有一些僞代碼,我希望這有助於瞭解您的問題/此解決方案。

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 +」)){}' –