【问题标题】:Sentence builder java句子生成器java
【发布时间】:2017-12-21 10:14:10
【问题描述】:

我试图让这段代码获取每个变量,将其传递给 builder 方法,并让它根据用户输入的内容创建一个完整的句子。 builder方法将其传回main方法,打印出由“主语+动词+形容词+宾语+副词”组成的完整句子。

我是否需要将每个用户输入存储到 ArrayList 中?如果是这样,我如何提示用户输入每个新句子?我尝试过使用 for 循环,但是假设我创建了 Array[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;
    }            
}

【问题讨论】:

  • 假设您可以将它们添加到 ArrayList 并在 builder 方法中检索它们。
  • 如果您选择使用数组来收集碎片,则没有任何法律禁止在没有for 循环的情况下访问数组元素。例如words[0] = ...words[3] = ...等。
  • 谢谢!我想我将使用下面列出的 Map 选项。如果我想在将来重用代码,似乎给了我一些额外的灵活性。感谢您的意见。
  • 用单独的变量存储每个单词有什么问题?问题不清楚。

标签: java arrays string arraylist methods


【解决方案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");
  }            
}

这样,您可以在需要时轻松地重新排列句子,甚至添加更多元素。

【讨论】:

  • 地图绝对是要走的路!非常有帮助。非常感谢
  • @JohnReynolds 是迄今为止我最常用的结构。地图用途广泛。作为一般规则,尽量避免使用String 作为键,因为性能不是很好。如果可能,请尝试使用Integer。但是对于像你这样的小Map 来说,这真的没什么区别。
  • 为什么要使用地图?一个简单的类更适合这里。
  • 一个简单的类?我认为这比Map 没有任何优势。事实上,这里使用一个类就是过度工程的一个例子。
  • @AdrianShum 尽管我看到您的解决方案也是正确的,但我觉得这有点矫枉过正。它使代码更难阅读,只是为了存储一堆变量并为它们提供许多 getter。此外,如果我们要处理最简单的情况,我们甚至不需要 builder 方法。只需打印连接并完成。总而言之,我看到 Map 解决方案简单明了(基于 OP askas),而对于这个简单的用例,类解决方案更加复杂。但是,如果您对此感到如此强烈,为什么不编写自己的解决方案?
【解决方案2】:

您不需要数组或地图或其他任何东西。要正确满足您的要求,您只需让您的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));

关于 Array/ ArrayList/ Map 的使用,鉴于您有一组非常明确的值可供使用,您不应该使用这些数据结构,因为它们用途广泛,使您的代码难以阅读且容易出错.声明一个简单的类来服务于类似结构的目的是一个更好的选择:

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的成员方法移到上面。

【讨论】:

  • 我同意这是非常易读的,看起来非常整洁!谢谢,我实际上可以在接下来的几周内将它用于我所在的 java 课程。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-22
  • 1970-01-01
相关资源
最近更新 更多