2017-07-17 58 views
0

我試圖使此代碼採取每一個變量,它向下傳遞到構建器方法,並將它創建基於對什麼是由用戶輸入一個完整的句子。構建器方法將其傳回主方法並打印出由「主語+動詞+形容詞+賓語+副詞」組成的完整句子。句子建設者的Java

我是否需要爲每個用戶輸入存儲到一個ArrayList?如果是這樣,我如何提示用戶每個新的句子?我試過使用for循環,但它只是問我第一行5次,假設我做了數組[5]。

package assignment.pkg4.pkg3.string.input; 
import java.util.Scanner; 

public class Assignment43StringInput { 
    private static Scanner scanner = new Scanner(System.in); 
    public static void main(String[] args) { 

     System.out.print("Enter a subject: "); 
     String subject = scanner.nextLine(); 

     System.out.print("Enter a verb: "); 
     String verb = scanner.nextLine(); 

     System.out.print("Enter an adjective: "); 
     String adjective = scanner.nextLine(); 

     System.out.print("Enter an object: "); 
     String object = scanner.nextLine(); 

     System.out.print("Enter an adverb: "); 
     String adverb = scanner.nextLine(); 


     System.out.print(builder(text)); 

    } 

    public static String builder(String text) { 
     String sentence = subject + verb + adjective + object + adverb; 
     return sentence; 
    }    
} 
+0

想你可以將它們添加到'ArrayList'以及'builder'方法檢索它們。 –

+0

如果您選擇使用數組來收集碎片,沒有'for'循環訪問數組的元素沒有任何規律。例如,'字[0] = ...','字[3] = ...'等 –

+0

謝謝!我想我會使用下面列出的地圖選項。似乎給我一些額外的靈活性,如果我想在未來重用代碼。我很欣賞這些意見。 –

回答

1

如果我正確理解你的問題,你想用一個獨特的結構,而不是爲每個輸入一個變量。如果你知道你的尺寸總是5,並且不會改變,那麼你可以使用String[]。或者,您可以使用List

但是,如果你想知道到底是什麼,你可能想給Map一去什麼。我將用一個例子解釋:

public class Assignment43StringInput { 
    private static Scanner scanner = new Scanner(System.in); 
    public static void main(String[] args) { 
    Map<String, String> map = new HashMap<>(); 

    System.out.print("Enter a subject: "); 
    map.put("subject", scanner.nextLine()); 

    System.out.print("Enter a verb: "); 
    map.put("verb", scanner.nextLine()); 

    System.out.print("Enter an adjective: "); 
    map.put("adjective", scanner.nextLine()); 

    System.out.print("Enter an object: "); 
    map.put("object", scanner.nextLine()); 

    System.out.print("Enter an adverb: "); 
    map.put("adverb", scanner.nextLine()); 

    System.out.print(builder(map)); 
    } 

    public static String builder(Map<String,String> map) { 
    return map.get("subject") + " " + map.get("verb") + " " + map.get("adjective") + " " + map.get("object") + " " + map.get("adverb"); 
    }    
} 

這樣你就可以很容易地重新排列你的句子,如果你需要的話,甚至加入更多的元素吧。

+0

地圖絕對似乎是要走的路!非常有幫助。非常感謝您 –

+0

@JohnReynolds我最常用的結構。地圖非常多才多藝。作爲一般規則,儘量避免使用'String'作爲關鍵,因爲性能不太好。儘可能使用'Integer'。但是對於像你這樣的小Map來說,它確實沒什麼區別。 – Tavo

+0

爲什麼使用Map?一個簡單的類在這裏更適合。 –

0

你不需要陣列或映射或什麼的。要正確實現你的要求,你只需要讓你的builder(我寧願把它buildSentence,作爲方法應該是動詞)接受相應的參數:

public static String buildSentence(String subject, 
            String verb, 
            String adj, 
            String obj, 
            String adverb) { 
    return subject + " " + verb + " " 
      + adjective + " " + object + " " + adverb; 
} 

,你只需用變量調用它通過在相應:

System.out.print(buildSentence(subject, verb, adjective, object, adverb)); 

關於使用數組/ ArrayList中/地圖的,因爲你有一個非常明確的組值的使用,因爲他們太多才多藝,你不應該使用這些數據結構並使你的代碼難以閱讀d容易出錯。聲明一個簡單的類,以服務爲結構類的目的是更好的選擇:

class Sentence { 
    public String subject; 
    public String verb; 
    public String adjective; 
    public String object; 
    public String adverb; 
} 

在你的主:

public static void main(String[] args) { 
    Sentence sentence = new Sentence(); 

    System.out.print("Enter a subject: "); 
    sentence.subject = scanner.nextLine(); 
    // do the same for other values 

    System.out.print(buildString(sentence)); 
} 

public static String buildString(Sentence sentence) { 
    return sentence.subject + " " 
     + sentence.verb + " " 
     + sentence.adjective + " " 
     + sentence.object + " " 
     + sentence.adverb; 
} 

見代碼是如何更清晰,可讀變成什麼?

更好的變化是將buildString()作爲Sentence的成員方法移動。

+0

我同意這是非常可讀的,看起來非常整齊!謝謝,我可以在接下來的幾周內用它來學習我所學的java課程。 –