在字符串中随机播放单词的中间字符?

时间:2014-12-17 21:46:13

标签: java string

以下是我需要解决的问题:

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;
    }
}

现在的问题是,它会洗掉所有字母,包括第一个和最后一个字母,我不能根据问题这样做。能帮我解决一下我的方法以及应该有哪些确切的代码?我可以看看它,看看我错在哪里以及我需要做什么。感谢。

我需要在没有数组或任何预定义方法的情况下完成它。

2 个答案:

答案 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)并且左边一个翻转,你明白为什么吗?

这个实现非常简单,但我留给你,因为它是一个任务。