以下是我需要解决的问题:
I dn’ot gvie a dman for a man taht can only sepll a word one way.
编写构造一个的方法String scramble(String word) 给定单词的混乱版本,随机翻转两个字符 除了第一个和最后一个。然后编写一个读取的程序 来自文件“input.txt”的单词(每行一个单词)并输出 每个单词的加扰版本(每行一对)到另一个 文件“scrambled.txt”。
我不需要将字符串转换为单词,每行只需一个单词。我需要读单词,而不是字符串。
到目前为止,我所做的就是:
import java.util.*;
import java.io.*;
public class examhelp
{
public static void main(String[]args)throws IOException
{
Scanner kbd=new Scanner(System.in);
File f=new File("words.txt");
Scanner inputFile=new Scanner(f);
PrintWriter outputFile=new PrintWriter("scrambled.txt");
bloop wlist=new bloop();
while(inputFile.hasNext())
{
String ww=inputFile.nextLine();
System.out.println(ww);
outputFile.println(wlist.scramble(ww));
}
inputFile.close();
outputFile.close();
}
}
class bloop
{
public static String scramble(String word)
{
String shuffledString = "";
while (word.length() != 0)
{
int index = (int) Math.floor(Math.random() * word.length());
char c = word.charAt(index);
word = word.substring(0,index)+word.substring(index+1);
shuffledString += c;
}
return shuffledString;
}
}
现在的问题是,它会洗掉所有字母,包括第一个和最后一个字母,我不能根据问题这样做。能帮我解决一下我的方法以及应该有哪些确切的代码?我可以看看它,看看我错在哪里以及我需要做什么。感谢。
我需要在没有数组或任何预定义方法的情况下完成它。
答案 0 :(得分:1)
我们首先采用您现有的scramble
方法并将其设为private
;我们还会改变它以获取两个额外的参数(类型char
),如
private static String scramble(char first, char last, String word)
{
String shuffledString = "" + first; // <-- add the first char
while (word.length() != 0)
{
int index = (int) Math.floor(Math.random() * word.length());
char c = word.charAt(index);
word = word.substring(0,index)+word.substring(index+1);
shuffledString += c;
}
return shuffledString + last; // <-- add the last char
}
然后我们可以使用该方法来实现一个{em} 中间
的public
版本
public static String scramble(String word) {
if (word.length() < 3) {
return word;
}
String middle = word.substring(1, word.length() - 1);
return scramble(word.charAt(0), word.charAt(word.length() - 1), middle);
}
编辑另外,如下所述;你正在使用
String ww=inputFile.nextLine();
但你的循环在Scanner.hasNext()
。如果您将其更改为Scanner.next()
String ww=inputFile.next();
你应该获得白色空间分隔的标记而不是线条。
答案 1 :(得分:0)
第1步:我希望您明白要洗牌的候选词必须至少包含4个字符;你只需按原样返回它们就可以省略较小的单词。
第2步:选择除第一个和最后一个之外的随机索引。
第3步:将每个随机选择的字符翻转到右边的一个字符。
表现提示1:您也可以通过省略半决赛来略微改善表现。无需选择和翻转半决赛角色,因为最后一个(省略)是在每一个角色。
表现提示2:或者你可以省略随机选择的第二个索引(索引= 1)并且左边一个翻转,你明白为什么吗?
这个实现非常简单,但我留给你,因为它是一个任务。