【问题标题】:Selecting words at random from given array to form sentence从给定数组中随机选择单词以形成句子
【发布时间】:2015-12-10 10:40:17
【问题描述】:

我是 Java 编程的初学者,正在学习 Ex。 Deitel&Deitel的16.5(随机句子)问题要求用从给定的冠词、名词、动词和介词数组中随机选择的单词组成句子,形成20个句子,其中句子必须按顺序组成:冠词、名词、动词、prep、冠词和名词。 它要求在单词之间放置空格,我不知道该怎么做。此外,我以非常错误的方式连接字符串,因此非常感谢您的帮助和指导。

import java.util.*;

public class Makeit{
  private static String[] article ={"the","a","one","some","any"};
  private static String[] noun={" boy"," girl"," dog"," town"," car"};
  private static String[] verb={" drove"," jmped"," ran"," walked","    skipped"};
  private static String[] preposition={" to"," from"," over"," under"," on"};


  public static void main(String args[]){
  //order to make a sent: a,n,v,p,a,n

    System.out.println("the sentences picked at random are:");
    //loop to generate 20 sentences
    for(int i=0;i<=19;i++){
      System.out.println(makeSentence());   
    }   
  }

  public static String makeSentence(){
    Random rand = new Random();
    int[] index = new int[6];
    String sent = new String();

    for(int i=0;i<6;i++){
         index[i]= rand.nextInt(5);
    }
    sent = sent.concat(article[index[0]].concat(noun[index[1]].concat(verb[index[2]].concat(preposition[index[3]].concat(article[index[4]].concat(noun[index[5]]))))));
    return sent;
  }
}

【问题讨论】:

  • 此时他们是否已经谈论过StringBuilder
  • @user1803551 在这里不需要使用显式的字符串生成器。使用 + 的多个连接被编译为在内部使用 StringBuilder,但显式使用它只是语法混乱。
  • 是的,他们做到了,但我对这门课还不太自信,所以没有使用它......谢谢
  • @AndyTurner 这是一个教学练习。如果他们了解了StringBuilder,那么这是一个使用它的好地方。如果句子较长(比如说不是句子,而是一长串数字)并且您需要超过 20 个句子,那么这将是必要的。

标签: java string


【解决方案1】:

您可以从数组中挑选单词并将它们存储在变量中:

String article1 = articles[rand.nextInt(articles.length)];
String noun = nouns[rand.nextInt(nouns.length)];
// ...

直接存储这些变量比将索引存储在数组中然后检索元素更好,因为它更有意义:例如index[1] 显然不是noun 数组中某个元素的索引,用来获取名词;一个名为noun 的变量显然是要在句子中使用的名词。

那么拼接和加空格就很简单了:

sent = article1 + " " + noun + " " + verb + " " + prepo + " " + article2 + " " + noun2;

请注意,无需分配sent = new String():保持未初始化即可,或者将其完全删除并直接返回连接的字符串:

return article1 + " " + ...;

【讨论】:

  • 谢谢安迪,你的方法对我来说更有意义。非常感谢!
【解决方案2】:

首先,您可以继续使用concat,但在每个单词之间的字符串" "上:

sent.concat(article[index[0]].concat(" ").concat(noun[index[1]].concat(" ").concat(verb[index[2]])));

它变得很麻烦。其次,当涉及到Strings 时,您可以使用+ 运算符而不是concat

sent = article[index[0]] + " " + noun[index[1]] + " " + verb[index[2]] + " " 
       + preposition[index[3]] + " " + article[index[4]] + " " + noun[index[5]];

另外,您不需要每次都在循环中使用Random rand = new Random() 创建一个新的Random。您可以将其移动到循环外的字段或局部变量中,并将其传递给您的造句方法。

最后,在使用nextInt(5) 生成随机数时,您可能需要调用nextInt(noun.length)(或其他数组),以防您在下一个“版本”中更改它们的大小。

【讨论】:

  • 我不明白如何使用 'concat' 方法插入空格....你能详细说明一下吗?
  • @prameshshakya 当然,我编辑了答案。你也想看看StringBuilder 的行动吗?你明白为什么使用它比我们现在做的更好吗?
  • 哦,我现在明白了..谢谢...是的,我想到的第一个方法是 StringBuilder,因为它提供了可变性选项,并且对于字符串的大多数“编辑和修改”,除了推荐StringBuffer,虽然我不想在不先自己研究的情况下打扰你。非常感谢!
  • @prameshshakya 好。使用本网站的提示:等到几个答案进来,而不是接受弹出的第一个答案 - 它通常不太详细,一旦你接受一个答案,你可能不会再得到任何答案。无论您接受哪个答案,您都可以投票赞成/有用的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-15
相关资源
最近更新 更多