2015-03-23 4 views
0

Я пытаюсь написать иерархический блок, который помещает элементы в ArrayList, кроме отдельного массива ArrayList. Что делает блок, это взять существующий ввод текста и добавляет каждую строку текста в элементы ArrayList. Каждая строка затем создается как ArrayList of Strings, причем каждая строка является словом в этой строке (я использовал String Split в пробелах ("") для выполнения этого).ArrayList нельзя отбрасывать в java.util.ArrayList, toArray ничего не возвращает

Моя проблема при попытке создать это мне нужно использовать Arrays.asList (поскольку строка Split возвращает список)

Action Syllables = new AbstractAction("Syllables") { 
    public void actionPerformed(ActionEvent e) { 
     ArrayList<String> text = LinetoList(area); 
     //"text" is a String ArrayList of every "line" in a piece of text 
     //LinetoList is a method that returns an ArrayList based on each new line 
     ArrayList<ArrayList> words = new ArrayList(); 
     for (int i = 0; i < text.size(); i++) { 
      ArrayList sentence = (ArrayList) Arrays.asList(text.get(i).split(" ")); 
      /*Sentence is currently a list, however, changing the type to an Array 
      * or Arraylist Changes nothing */ 
      words.add(sentence); 
      } 
     for (int k = 0; k < words.size(); k++) { 
      for (int i= 0; i < words.get(k).size(); i ++) { 
       System.out.println(words.get(k).get(i)); 
      } 
     } 
    } 
}; 

Это был мой оригинальный метод, который возвращает ошибку. С тех пор я немного скорректировал, что больше не возвращает ошибку, но ничего не возвращает.

Action Syllables = new AbstractAction("Syllables") { 
    public void actionPerformed(ActionEvent e) { 
     ArrayList<String> text = LinetoList(area); 
     //"text" is a String ArrayList of every "line" in a piece of text 
     //LinetoList is a method that returns an ArrayList based on each new "line" 
     ArrayList<ArrayList> words = new ArrayList(); 
     for (int i = 0; i < text.size(); i++) { 
      ArrayList <String> sentences = new ArrayList(); 
      String sentence[] = text.get(i).split(" "); 
      sentence = sentences.toArray(sentence); 
      /*Sentence is currently a list, however, changing the type to an Array 
      * or Arraylist Changes nothing */ 
      words.add(sentences); 
      } 
     if (words.size() == 0) 
     {System.out.println("Theres nothing here"); } 
     else { 
     for (int k = 0; k < words.size(); k++) { 
      for (int i= 0; i < words.get(k).size(); i ++) { 

       System.out.println(words.get(k).get(i));} 

      } 
     } 
    } 
}; 

Любая обратная связь или идеи о том, как подойти к решению, приветствуются.

EDIT: Некоторые люди попросили функцию LinetoList. Большинство программ использует ArrayLists строк, поэтому он так сильно используется здесь.

private static ArrayList<String> LinetoList(JTextArea textArea) { 

    String s[] = textArea.getText().split("\\r?\\n"); 
    ArrayList<String>arrList = new ArrayList<>(Arrays.asList(s)) ; 
    return arrList; 
} 
+1

1) 'String.split()' возвращает 'Array []' not 'List' – Antoniossss

+0

Обратная связь: рассмотрите возможность переименования переменных. предложения являются ArrayList, а затем предложение представляет собой массив ... Я нашел это довольно запутанным. Значение: старайтесь избегать имен переменных, которые почти идентичны. – GhostCat

+0

Использовать 'ArrayList предложение = новый ArrayList <> (Arrays.asList (предложения));' и затем 'words.addAll (предложение)'. Вы могли бы просто работать со списком вместо этого, поскольку он, кажется, выходит из области действия после добавления слов в любом случае. – Soronbe

ответ

0

Итак, взглянув на комментарии по поводу работы toArray и asList, я попробовал другой подход, основанный больше на моей функции linetolist

результат был

Action Syllables = new AbstractAction("Syllables") { 
    public void actionPerformed(ActionEvent e) { 
     ArrayList<ArrayList> words = new ArrayList(); 
     ArrayList<ArrayList> splitLines = new ArrayList(); 
     ArrayList<String> characters = new ArrayList(); 
     //^^goes to (As hierarchey) 
     ArrayList<String> text = LinetoList(area); 
     //text is a String ArrayList of every line in a text 
     //LinetoList is a method that returns an ArrayList based on each new line 
     for (int i = 0; i < text.size(); i++) { 
      //for each line we have 
      String sentence[] = text.get(i).split(" "); 
      ArrayList<String> splitText = new ArrayList<>(Arrays.asList(sentence)); 
      words.add(splitText); 
      } 
     for (int j = 0; j < words.size(); j++) { 
      String sentence [] = text.get(j).split(" "); 
      ArrayList<String> splitText = new ArrayList<>(Arrays.asList(sentence)); 
      ArrayList<ArrayList> SplitWords = new ArrayList(); 
      for (int i =0; i < sentence.length; i++) { 
       ArrayList<Character> SplitCharacters = new ArrayList<Character>(); 
       for (int k = 0; k < splitText.get(i).length(); k ++) { 

       SplitCharacters.add(splitText.get(i).charAt(k)); 

       } 
       SplitWords.add(SplitCharacters); 
      } 
      splitLines.add(SplitWords); 

     if (words.size() == 0) 
     {System.out.println("Theres nothing here"); } 
     else { 
     for (int k = 0; k < words.size(); k++) { 
      System.out.println("\n"); 
      for (int i= 0; i < words.get(k).size(); i ++) { 
       System.out.println(words.get(k).get(i)); 
       } 

      } 
     System.out.println("That was the original method \n"); 
     for (int k = 0; k < splitLines.size(); k++) { 
      System.out.println(splitLines.get(k).toString() + "\n"); 

      } 
     } 
    }  
} 
}; 

я включал два различных подхода к решению этой проблемы, тот, который упрощает вещи как ArrayList слов и одно, что дает ArrayList из ArrayList символов (или список массива слов, которые держат буквы) Спасибо за помощь. Надеюсь, кто-нибудь еще может что-то убрать из моих ошибок.

0

Я на самом деле не следуют:

String sentence[] = text.get(i).split(" "); // here you have array 
    sentence = sentences.toArray(sentence); // WTF? 

А теперь о том, что ВТФ марки - вы заполняете sencence массив с содержанием sentences. Что лучше, я не вижу объявления sentences, но я думаю, что это просто пусто? То почему вы видите его пустым все время. Что касается меня, в нем много странного кода и бесполезных комментариев.

+0

Это было недоразумение при чтении функции toArray. Я думал, что он работает аналогично asList, поскольку он просто превратил один набор данных в другой тип (So, list будет преобразовывать «в массив»). Это было больше экспериментов с этим типом, поэтому более тщательное (если немного тупое) объяснение помогает. Я нашел описание документации java, не полностью описывающее, как эта функция работает или реализована. Любые мысли о другой версии этого метода? Я перечислил двух, зная, что у них обоих были проблемы. Я чувствую, что у другого меньше недостатка в понимании его компонентов. – Tordehielbach

0

1) Arrays.asList не возвращает java.util.ArrayList, если вы хотите быть ArrayList, то вам нужно сделать ArrayList sentence = new ArrayList(Arrays.asList(text.get(i).split(" ")));

2) toArray метод помещает все элементы из коллекции в массив. в вашем случае коллекция пуста, поскольку вы создаете почти до того, как вы назовете метод

+0

Я сделал больше исследований, мое первоначальное чтение toArray превратило бы что-то «в массив». Однако, зная это, насколько возможно выполнить итерацию через каждый элемент в списке и использовать «toArray» для фактического создания массива. – Tordehielbach

Смежные вопросы