2017-07-17 27 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课程。 –