繁体   English   中英

如何对从文本文件中随机选择的单词进行加扰

[英]How to scramble a word that is picked randomly from a text file

我正在尝试编写一个程序,该程序从文本文件中选择一个随机单词,对其进行加扰,并允许用户通过一次交换2个索引位置来对其进行加扰。

我将程序抓到了从文本文件中抓取一个随机单词并用它上面的索引号打印出来的程度。

我在弄清楚如何:

  1. 在屏幕上打印出来之前先弄乱单词,然后
  2. 如何使用户能够一次通过交换2个索引来循环直到单词未加扰。

我可以编写一种可以执行这些操作的方法吗?

到目前为止,这是我的代码。

import java.io.*;
import java.util.*;

public class Midterm { // class header

    public static void main(String[] args) { // Method header

        int option = 0;
        Scanner input = new Scanner(System.in);
        int scrambled;
        int counter = 0;
        int index1;
        int index2;     

        String[] words = readArray("words.txt");
        /*
         * Picks a random word from the array built from words.txt file. Prints
         * index with word beneath it.
         */
        int randWord = (int) (Math.random() * 11);

        for (int j = 0; j < words[randWord].length(); j = j + 1) {
            System.out.print(j);
        }

        System.out.print("\n");     
        char[] charArray = words[randWord].toCharArray();
        for (char c : charArray) {          
            System.out.print(c);
        }
        /*
         * Prompt the user for input to play game or quit.
         */
        System.out.println("\n");
        System.out.println("Enter 1 to swap a par of letters.");
        System.out.println("Enter 2 to show the solution and quit.");
        System.out.println("Enter 3 to quit.");     

        if (input.hasNextInt()) {
            option = input.nextInt();
            counter++;          
        }
        else {
            option = 3;
        }
        System.out.println("");

        if (option == 1) {
            System.out.println("Enter the two index locations to swap separated by a space. ");
            index1 = 0;
            index2 = 0;
            if (input.hasNextInt()) {
                index1 = input.nextInt();
                }
            else {
                System.out.println("Please enter only numbers.");
            }

            if (input.hasNextInt()) {
                index2 = input.nextInt();
                }
            else {
                System.out.println("Please enter only numbers.");
            }
        } 
        }   



    // end main

    public static String[] readArray(String file) {
        // Step 1:
        // Count how many lines are in the file
        // Step 2:
        // Create the array and copy the elements into it

        // Step 1:
        int ctr = 0;
        try {
            Scanner s1 = new Scanner(new File(file));
            while (s1.hasNextLine()) {
                ctr = ctr + 1;
                s1.nextLine();
            }
            String[] words = new String[ctr];

            // Step 2:
            Scanner s2 = new Scanner(new File(file));
            for (int i = 0; i < ctr; i = i + 1) {
                words[i] = s2.next();

            }
            return words;
        } catch (FileNotFoundException e) {

        }
        return null;

    }
}

您正在错误地读取文件。

public static String[] readArray(String file) {
    int ctr = 0;
    try {
        Scanner s1 = new Scanner(new File(file));
        while (s1.hasNext()) {
            ctr = ctr + 1;
            s1.next();
        }
        //..rest of code

我对您的代码进行了一些相当大的修改,包括添加了加扰器方法。 该程序几乎是完美的,只是您的文件“ words.txt”不能包含重复字母的单词。 例如,黄色,绿色和紫色无法正确解读,但是白色,灰色,蓝色,橙色或红色将可以正常工作。 除此之外,该程序运行良好。 它选择一个随机单词,然后在求解后选择另一个单词,将最后一个单词更改为null,这样就不会再次被选中。 这是程序:

import java.io.*;
import java.util.*;

public class Experiments { // class header

    private static String[] words = readArray("/Users/UserName/Desktop/words.txt"); //change to your location of the file

    public static void main(String[] args) { // Method header
        int option = 0;
        Scanner input = new Scanner(System.in);
        int counter = 0;
        String scrambledWord;
        int index1;
        int index2;     

        Random rand = new Random();
        int randWord = rand.nextInt(words.length);

        for (int j = 0; j < words[randWord].length(); j += 1) {
            System.out.print(j);
        }

        System.out.print("\n");     
        scrambledWord = scrambler(words[randWord]);
        System.out.println(scrambledWord);     

        System.out.println("\n");
        System.out.println("Enter 1 to swap a pair of letters.");
        System.out.println("Enter 2 to show the solution and quit.");
        System.out.println("Enter 3 to quit."); 
        option = input.nextInt();

        if (option == 1) {
            while (!scrambledWord.equals(words[randWord])) {
                index1 = 0;
                index2 = 0;
                boolean validOption = false;
                System.out.println("Enter the two index locations to swap separated by a space.");
                while (!validOption) {
                    if (input.hasNextInt()) {
                        index1 = input.nextInt();
                        index2 = input.nextInt();  
                        validOption = true;
                    }
                    else {
                        System.out.println("Please enter only numbers.");
                        validOption = false;
                        break;
                    }
                }
                String letter1 = scrambledWord.substring(index1, index1+1);
                String letter2 = scrambledWord.substring(index2, index2+1);
                System.out.println("replacing " + letter1 + " with " + letter2 + "...");
                if (index1 < index2) {
                    scrambledWord = scrambledWord.replaceFirst(letter2, letter1);                 
                    scrambledWord = scrambledWord.replaceFirst(letter1, letter2); 
                } else {
                    scrambledWord = scrambledWord.replaceFirst(letter1, letter2);                 
                    scrambledWord = scrambledWord.replaceFirst(letter2, letter1); 
                }
                System.out.println();
                for (int j = 0; j < words[randWord].length(); j += 1) {
                    System.out.print(j);
                }
                System.out.println("\n"+scrambledWord);
                System.out.println();
                counter++;
                if (scrambledWord.equals(words[randWord])){
                    System.out.println("You did it! The word was " + words[randWord]);
                    System.out.println("You got it with " + counter + " replacements!");
                    words[randWord] = null;
                    if (words.length == 0){
                        System.out.println("I'm all out of words. You win!");
                        System.exit(0);
                    } else {
                        main(args);
                    }
                }
            } 

        } else if (option == 2) {
            System.out.println(words[randWord]);
            System.exit(0);
        } else {
            System.exit(0);
        }
        input.close();
   }   

    //scrambles the word given to it
    private static String scrambler(String word) { 
        String scrambled = "";
        Random rand = new Random();
        int length;
        int index;
        String letter;
        String firststring;
        String secondstring;

        while (word.length()>0) {
            length = word.length();
            index = rand.nextInt(length);
            letter = word.substring(index, index+1);
            firststring = word.substring(0, index);
            secondstring = word.substring(index+1);
            word = firststring + secondstring;
            scrambled += letter;
        }
        return scrambled;
    }

    public static String[] readArray(String file) {
        int ctr = 0;
        try {
            Scanner s1 = new Scanner(new File(file));
            while (s1.hasNextLine()) {
                ctr = ctr + 1;
                s1.nextLine();
            }
            String[] words = new String[ctr];

            // Step 2:
            Scanner s2 = new Scanner(new File(file));
            for (int i = 0; i < ctr; i = i + 1) {
                words[i] = s2.next();

            }
            return words;
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        return null;
        }
}

这是words.txt文件中的单词列表(我几乎记下了突然出现的没有重复字母的所有内容):

orange
red
brown
black
white
blue
tiger
horse
bugs
stack
overflow
pathfinder
extra
zealous
wisdom
under
above
death
life
second
first
frost
forest

这些显然不是唯一可以输入的单词,您可以根据需要添加任意数量的单词,只要它们没有两次出现同一字母即可。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM