java - 如何将文本文件中的单词添加到我创建的数组中?

标签 java arrays text-files

所以我有这个文本文件,其中有一堆单行单词,我想将它们添加到数组中。但不知何故,JUnit 测试总是失败。关于如何解决这个问题有什么想法吗?变量 numberOfWords 已被声明并赋值。

public void addWordsToArray(String fileName) {
    loadWords(fileName); 

    String[] words = new String[numberOfWords];
    for (int i = 0; i < numberOfWords; i++) {
        words[i] = iter.next(); } }

-----完整文件如下。我还将分享测试-------------

public class Words {

ArrayList<String> wordList; // All the words
Iterator<String> iter; // iterator for the wordlist
int numberOfWords; // number of words in the file

String[] words; // this array holds your words

public Words() {
    wordList = new ArrayList<>();
    // iter = wordList.iterator();
}

/**
 * This method loads the words from a given file
 * 
 * @param fileName
 *            input file name
 */
private void loadWords(String fileName) {
    wordList.clear();
    numberOfWords = 0;
    // This will reference one line at a time
    String line = null;
    int count = 0;
    try {
        // FileReader reads text files in the default encoding.
        FileReader fileReader = new FileReader(fileName);

        // Always wrap FileReader in BufferedReader.
        BufferedReader bufferedReader = new BufferedReader(fileReader);

        while ((line = bufferedReader.readLine()) != null) {
            wordList.add(line.toLowerCase());
            count++;
        }

        // Always close files.
        bufferedReader.close();
        numberOfWords = count;
        iter = wordList.iterator();
    } catch (FileNotFoundException ex) {
        System.out.println("Unable to open file '" + fileName + "'");
    } catch (IOException ex) {
        System.out.println("Error reading file '" + fileName + "'");
    }
}

public String getWord(int index) {
    if (index < 0 || index >= numberOfWords) {
        return null;
    }
    return words[index];
}

/**
 * This method adds all the words to an array called words
 * 
 * variable numberOfWords is already declared and has value and contains number
 * of words
 * 
 * @param fileName:
 *            input file name
 */
public void addWordsToArray(String fileName) {
    loadWords(fileName); // DO NOT CHANGE

    String[] words = new String[numberOfWords];
    for (int i = 0; i < numberOfWords; i++) {
        words[i] = iter.next();

        // variable numberOfWords has the number of words
    // TODO
    // String[] words has been declared. Now instantiate the array to the words
    // array size is equal to the number of words

    }
    // words = null;
    // TO DO
    /**
     * Calling iter.next() will return the next word in the file. For examples
     * String w = iter.next(); iter.next() always gives a next word
     */

    // TO DO
    // Add all word into the array words

}

/**
 * 
 * @param word:
 *            input
 * @return true if the given word exits in the words array. False otherwise
 */
public boolean contains(String word) {
    for (String wordz : wordList) {
        if (wordz.contains(word)) {
            return true;
        }
    }
    return false;
}

/**
 * 
 * @param sentence:
 *            input sentence
 * @return true if every word in the sentence exists in your words array. False
 *         otherwise.
 */
public boolean containsSentence(String sentence) {
    String[] sp = sentence.split(" ");
    for (String wordz : wordList) {
        if (wordz.equals(sp)) {
            return true;
        }
    }

    return false;
}

/**
 * reverse a sentence
 * 
 * @param sentence:
 *            input sentence
 * @return reversed sentence. For example: input: "i love you" return: "you love
 *         i" (hint: trim leading and trailing spaces")
 */
public String reverseSentence(String sentence) {
    // if(sentence == null || sentence.length()==0) {
    // return sentence;
    // }
    String[] sp = sentence.split(" ");
    StringBuilder sb = new StringBuilder();
    for (int i = sp.length - 1; i >= 0; i--) {
        sb.append(sp[i]);
        sb.append(" ");
    }
    return sb.toString().trim();

}

/**
 * 
 * @param word:
 *            input word
 * @return the number of occurrences of the word . If the word does not exist,
 *         return 0
 */
public int count(String word) {
    int count = 0;
    for (String wordz : wordList) {
        if (wordz.equalsIgnoreCase(word)) {
            count++;
            // return count++;
        }
    }

    return count;
}

/**
 * 
 * @param word1:
 *            input word
 * @param word2:
 *            input word
 * @return true if all letters from word1 exist in word2, and all letters from
 *         word2 exist in word1.
 */
public boolean anagram(String word1, String word2) {
    String sw1 = word1.replaceAll("\\s", "");

    String sw2 = word2.replaceAll("\\s", "");
    boolean check = true;
    char[] w1 = sw1.toLowerCase().toCharArray();
    char[] w2 = sw2.toLowerCase().toCharArray();
    Arrays.sort(w1);
    Arrays.sort(w2);

    if (sw1.length() != sw2.length()) {
        return false;
    } else {
        check = Arrays.equals(w1, w2);

    }
    if (check) {
        return true;
    } else

        return false;

}

/**
 * 
 * 
 * @param word:
 *            input word
 * @param fileName:
 *            input file name
 * 
 *            PRINT all words that are the anagrams to the word input within
 *            words array
 * 
 */
public void findAnagram(String word, String fileName) {
    addWordsToArray(fileName); // DO NOT CHANGE

}} 

 }

------测试是:------------

import static org.junit.Assert.*;

import java.io.ByteArrayOutputStream;
import java.io.File;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;

import words.Words;

public class PublicTests {

Words w; 
@BeforeClass
public static void setUpBeforeClass() throws Exception {
}

@AfterClass
public static void tearDownAfterClass() throws Exception {
}

@Before
public void setUp() throws Exception {
    w = new Words();
}

@After
public void tearDown() throws Exception {
}

@Test
public void testaddWordsToArray1() {
    w.addWordsToArray("common_names.txt");
    String result = w.getWord(4);
    String expected = "william";
    assertEquals(expected,result);
}

@Test
public void testaddWordsToArray2() {
    w.addWordsToArray("names.txt");
    String result = w.getWord(2);
    String expected = "akbar";
    assertEquals(expected,result);
}


@Test
public void testContains1() {
    w.addWordsToArray("names.txt");
    boolean result = w.contains("akbar");
    assertTrue(result);
}


@Test
public void testContains2() {
    w.addWordsToArray("names.txt");
    boolean result = w.contains("administration");
    assertFalse(result);
}


@Test
public void testContains3() {
    w.addWordsToArray("1000words.txt");
    boolean result = w.contains("administration");
    assertTrue(result);
}


@Test
public void testContainsSentence1() {
    w.addWordsToArray("1000words.txt");
    boolean result = w.containsSentence("i buy book");
    assertTrue(result);
}

@Test
public void testContainsSentence2() {
    w.addWordsToArray("1000words.txt");
    boolean result = w.containsSentence("i love you");
    assertTrue(result);
}

@Test
public void testContainsSentence3() {
    w.addWordsToArray("1000words.txt");
    boolean result = w.containsSentence("she loves me");
    assertFalse(result);
}


@Test
public void testReverseSentence1() {
    String result = w.reverseSentence("i love you");
    String expected = "you love i";
    assertEquals(expected, result);
}

@Test
public void testReverseSentence2() {
    String result = w.reverseSentence("maria");
    String expected = "maria";
    assertEquals(expected, result);
}

@Test
public void testReverseSentence3() {
    String result = w.reverseSentence("cybertek school");
    String expected = "school cybertek";
    assertEquals(expected, result);
}


@Test
public void testCount1() {
    w.addWordsToArray("test1.txt");
    int result = w.count("abcd");
    int expected = 2;
    assertEquals(expected,result);
}

@Test
public void testCount2() {
    w.addWordsToArray("test1.txt");
    int result = w.count("bbcc");
    int expected = 1;
    assertEquals(expected,result);
}

@Test
public void testCount3() {
    w.addWordsToArray("names.txt");
    int result = w.count("trump");
    int expected = 0;
    assertEquals(expected,result);
}


@Test
public void testAnagram1() {
    boolean result = w.anagram("abcd", "bcda");
    assertTrue(result);
}
@Test
public void testAnagram2() {
    boolean result = w.anagram("bbd", "ddb");
    assertTrue(result);
}

@Test
public void testAnagram3() {
    boolean result = w.anagram("abcd", "aadb");
    assertFalse(result);
}


@Test
public void testFindAnagram1() throws Exception, Throwable{
    runProgramWithInput("abcd", "test1.txt");
}


@Test
public void testFindAnagram2() throws Exception, Throwable{
    runProgramWithInput("save", "1000words.txt");
}



/**
 * Executes a run of the OrdersProcessor program by reading the data
 * in the specified file using input redirection.  The file inputFileName
 * has the item's data file, whether multiple threads will be used,
 * number of orders, base file name for the orders, and the 
 * result file name.
 * 
 * @param inputFilename
 * @throws Exception
 * @throws Throwable
 */
private void runProgramWithInput(String word, String inputFilename) throws Exception, Throwable {

    /* Retrieving the name of the results file */

    String filename="";
    int i = inputFilename.lastIndexOf('.');
    if (i > 0) {
        filename = inputFilename.substring(0,i);
    }

    String resultsFilename = filename + "_out.txt";
    String officialResultsFilename = filename + "_expected.txt";

    /* Deleting results file (in case it exists) */
    File file = new File(resultsFilename);
    file.delete();

    /* Actual execution of the test by using input redirection and calling 
    /* OrdersProcessor.main(null) */
    TestingSupport.redirectStandardInputTo(inputFilename);
    ByteArrayOutputStream b = TestingSupport.redirectStandardOutputToByteArrayStream();

    w.findAnagram(word, inputFilename);

    String output = b.toString();
    TestingSupport.writeToFile(resultsFilename, output);

    /* Checking if we got the right results */
    assertTrue(TestingSupport.sameContents(resultsFilename, officialResultsFilename));
}


   }

-.------

最佳答案

正如@scigs 的评论所指出的,您在这里遗漏了很多内容。我假设您只是尝试将文件中的所有单词加载到一个数组中(并且每行一个单词)。您可以使用扫描仪来完成此操作:

Scanner scanner = new Scanner(new File(filename));
ArrayList<String> words = new ArrayList<>();
while (scanner.hasNextLine()) {
    words.add(scanner.nextLine().trim());
}

您还可以将 Apache Commons commons-io 库用于其 IOUtils 类。 IOUtils.readLines() 方法的作用与上面的代码块的作用非常相似,但使用起来显然更方便/更紧凑:

List<String> words = IOUtils.readLines(new FileInputStream(filename));

关于java - 如何将文本文件中的单词添加到我创建的数组中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50161086/

相关文章:

java - 要从 CSV 文件中检索数据,请将其拆分并将一列数据存储在字符串数组中,且不重复

c++ - 在 C++ 中读取文本文件显示无输出

c# - CheckedListBox - 如何以编程方式确保在任何给定时间只能选中一项?

java - 如何测试Web服务连接

java - 使用 if 和 while 接受数组中的元素

java.lang.ClassNotFoundException : org. apache.derby.jdbc.EmbeddedDriver 错误

比较c中字符串数组中的数据

javascript - .reduce() 函数如何与 Javascript 中的 Math.max() 一起使用?

c - 数组的值在执行期间随机变化

python - 标记化数据时出错。 C 错误 : EOF following escape character