繁体   English   中英

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

[英]How do I add words from an text file to an array i created?

因此,我有一个文本文件,其中包含一堆要添加到数组中的单行单词。 但是,以某种方式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 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));
words = new String[numberOfWords];
    for (int i = 0; i < numberOfWords; i++) {
        words[i]=iter.next();

工作完美。 多谢你们!

暂无
暂无

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

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