Как разбить слова в String ArrayList в Java, а затем обратить их вспять? - PullRequest
0 голосов
/ 07 декабря 2018

Название может показаться запутанным.

Просто у меня есть файл, в котором есть текст.Я использовал сканер, чтобы прочитать этот текст.Я сохранил этот текст в ArrayLists, который является строкой.Проблема у меня заключается в том, что мне нужно, чтобы метод обращал текст в этом ArrayList.Текст меняется, но не полностью.Мне нужно, чтобы слова тоже были в обратном порядке, но мой String ArrayList разбит на предложения.

Поэтому мне нужна помощь, чтобы добраться до каждого ArrayList и разбить эти слова на другие "", а затем поместить их в мой метод, чтобы он мог правильно перевернуть слова.

То, чего я хочу достичь, - это сначала разорвать строки и перевернуть слова.Сложная часть по-прежнему возвращает весь текст в строках.Мой профессор рекомендовал создать вспомогательные методы для решения этой проблемы.Пожалуйста помоги.

 package thePackage;
   /**
    * Adan Vivero
   * 12.6.18
   * In this lab, I will be working with classes, 
   ArrayLists, and files 
   * mainly.
   */

 import java.io.File;
 import java.util.ArrayList;
 import java.io.*;
 import java.util.*;

 /**
 * In this class, we create two private variables which is a File and 
 * ArrayList that is a String that will be
 * initialized later on in the code.
 */
 public class FileManipulator
 {
 private File inputFile;
 private ArrayList <String> words;
 /**
 * In this method, we are initializing the File and Arraylist and 
 * having a Scanner reach a file to grab the text
 * and insert it into the ArrayList as a String.
 * @param fileName is a type String that the user in the other class 
 * "FileDriver" types in and it reads the file.
 * @throws FileNotFoundException if the file does not exist.
 */
 public FileManipulator(String fileName) throws FileNotFoundException
 {
    inputFile = new File(fileName);
    words = new ArrayList<String>();
    Scanner fileWords = new Scanner(inputFile);
    while(fileWords.hasNextLine())  /** This will read the file and 
 continue to loop as long as there are still more lines left to read 
 from the file. */
    {
        String lineScan = fileWords.nextLine(); /** I created a String 
 called LineScan that will read the whole line of the file as a String 
 */
        words.add(lineScan);    /** Right here, we add whatever the 
 String LineScan read, into the String ArrayList. (It adds in lines, 
 not individual words.) */
    }
    System.out.println(words.size() + " ");
 }

/**
 * In this method, the goal is to reverse everything that is in the 
ArrayList "words". It is flawed at the moment since
 * it correctly returns the lines in reverse order, but the words in 
each line are not reversed. 
 */
public void reverse()
{
    for(int i = words.size()-1; i >= 0; i--) /** This for loop reverses 
*each of the lines in reverse order. */
    {
        System.out.println(words.get(i) + " ");
    }
    for(int i = 0; i < words.size(); i++)
    {
        //System.out.print(words.get(i) + " ");
    }
 }
 public void removePlurals()
 {
    for(int i = words.size()-1; i >= 0; i--)
    {
        String plurals = words.get(i);
        if(plurals.endsWith("s"))
        {
            words.remove(i);
        }
        System.out.println(words.get(i) + " ");
    }
 }
 public void stutter(int k)
 {
    k = 3;
    for(int i = words.size()-1; i <= words.size()-1; i++)
    {
        System.out.println(words.get(i));
    }
}
}

Токовый выход:

when tweetle beetles fight , 
it's called a tweetle beetle battle .

and when they battle in puddles , 
they are tweetle beetle puddle battles .

and when tweetle beetles battle with paddles in puddles , 
they call them tweetle beetle puddle paddle battles .

and ...

when beetles battle beetles in  puddle paddle battles 
and the beetle battle puddles are puddles in  bottles ...
... they call these tweetle beetle bottle puddle paddle battle muddles .

and ...

when beetles fight these bottle battles with their paddles 
and the bottles are on poodles and the poodles are eating noodles ...
... they call these muddle puddle tweetle poodle beetle noodle 
bottle paddle battles .

Желаемый выход:

. battles paddle bottle
noodle beetle poodle tweetle puddle muddle these call they ...
... noodles eating are poodles the and poodles on are bottles the and
paddles their with battles bottle these fight beetles when

... and

. muddles battle paddle puddle bottle beetle tweetle these call they ...
... bottles in puddles are puddles battle beetle the and
battles paddle puddle in beetles battle beetles when

... and

. battles paddle puddle beetle tweetle them call they
, puddles in paddles with battle beetles tweetle when and

. battles puddle beetle tweetle are they
, puddles in battle they when and

. battle beetle tweetle a called it's
, fight beetles tweetle when

Ответы [ 3 ]

0 голосов
/ 07 декабря 2018

Если вы хотите сохранить предложения, но перевернуть слова в каждом предложении, вы можете сделать:

while(fileWords.hasNextLine()) {
    StringBuilder sb = new StringBuilder();
    String[] wordsArr = fileWords.nextLine().split("\\s+");
    for(String str: wordsArr) {
        sb.insert(0, str).insert(str.length(), " ");
    }
    words.add(sb.toString());

}
Collections.reverse(words);
words.forEach(System.out::println);

Если вы пытаетесь получить List слов в обратном порядкеorder:

Проблема в том, что вы добавляете строки к вашему List, а затем печатаете эти строки в обратном порядке, но не слова.Вы можете легко исправить это, разбив линию на пустое пространство и добавив все эти токены в List.Вы можете сделать это, используя метод split():

for(String str : lineScan.split("\\s+")) {
    words.add(str);
}

Однако мы можем сделать это более элегантно с помощью Collections.addAll:

Collections.addAll(words, lineScan.split("\\s+")); 

Или когда вы печатаете, вы можете разделить его на слова там:

for(int i = words.size()-1; i >= 0; i--) 
{
    String[] wordArr = words.get(i).split("\\s+");
    for(int j = wordArr.length - 1; j >= 0; j--) {
       System.out.println(wordArr[j]);
    }
}

Или java 8 +:

BufferedReader br = new BufferedReader(new FileReader(fileName));
List<String> list = br.lines()
                      .map(e -> e.split("\\s+"))
                      .flatMap(lineArr -> Arrays.stream(lineArr))
                      .collect(Collectors.toList());
Collections.reverse(list);

, которые будут использовать lines() метод, чтобы взять поток строк, разбить их на слова, обратить их, а затем собрать их в List, а затем обратить их

0 голосов
/ 08 декабря 2018

Я понял это.Я получил некоторую помощь здесь, но я перенес ее на свой обратный метод.

public class FileManipulator
{
 private File inputFile;
 private ArrayList <String> words;
 /**
  * In this method, we are initializing the File and Arraylist and having a 
Scanner reach a file to grab the text
  * and insert it into the ArrayList as a String.
  * @param fileName is a type String that the user in the other class 
"FileDriver" types in and it reads the file.
 * @throws FileNotFoundException if the file does not exist.
 */
 public FileManipulator(String fileName) throws FileNotFoundException
 {
    inputFile = new File(fileName);
    words = new ArrayList<String>();
    Scanner fileWords = new Scanner(inputFile);

    while(fileWords.hasNextLine())
    {
        StringBuilder sb = new StringBuilder();
        String[] wordsArr = fileWords.nextLine().split("\\s+");
        for(String str: wordsArr)
        {
            sb.insert(0, str).insert(str.length(), " ");
        }
        words.add(sb.toString());

    }
  }

  /**
  * In this method, the goal is to reverse everything that is in the ArrayList 
"words". It is flawed at the moment since
  * it correctly returns the lines in reverse order, but the words in each line 
are not reversed.
 */
 public void reverse()
 {

    for(int i = words.size()-1; i >= 0; i--) // This for loop reverses each of 
the lines in reverse order.
    {
        System.out.println(words.get(i) + " ");
    }
 }
0 голосов
/ 07 декабря 2018

(Пожалуйста, приведите примеры.)

Я предполагаю, что хочу разделить слова, а затем изменить их порядок.

В этом случае попробуйте использовать String.split ("") сделать массив символов.то есть:

String sentence = "This is my very poorly made answer.";
String [] words2 = sentence.split(" ");
String [] words = new int [words.length];
for(int i=words.length; i<=0; i--){
    words[words.length - i] = words2[i];
}

Также, вероятно, есть другие методы, встроенные в библиотеку Java, которые могут делать то, что вы просите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...