2015-12-29 2 views
0

У меня есть простая петля над массивом String, которая затем передает String методу threadlist. Однако я не могу напечатать оба String. Он просто печатает второе имя "Fred", что заставляет меня думать, что я переписываю первую строку со второй строкой. Как я могу сделать, чтобы ArrayList включал обе строки "Tim" и "Fred"?Looping thread arraylist

import java.util.ArrayList; 

public class Threads extends Thread implements Runnable{ 

    private ArrayList threadList; 
    private String e; 

    public static void main(String[] args) { 
     String[] elements = {"Tim","Fred"};  
     Threads t = new Threads(); 
     for (String e: elements) {   
      t.threadL(e); 
     } 
     //loop over the elements of the String array and on each loop pass the String to threadL 

     for (int index = 0;index<t.threadList.size();index++){ 
      System.out.print(t.threadList.get(index)); 
     } 
     //loop over the threadList arraylist and printout 
    } 

    public ArrayList<String> threadL(String e) { 
     threadList = new ArrayList<>(); 
     threadList.add(e); 
     return(threadList); 
    } 
} 
+2

'threadList = new ArrayList <>();' как вы думаете, что происходит здесь? Особенно, когда вы вызываете 'threadL' второй раз? – Tom

+2

Где вы реализуете Runnable? – Untitled123

+0

Вы создаете новый 'ArrayList' каждый раз, когда вызывается' threadL'. –

ответ

5

Непосредственное решение вашей проблемы является то, что вы инстанцирования threadList переменной каждый раз, когда метод threadL вызывается. Поэтому на второй вызов, независимо хранилась до того не принимается во внимание и добавляют новое содержание:

public ArrayList<String> threadL(String e) { 
    threadList = new ArrayList<>(); // <-- instantiates a new list each time it is called 
    threadList.add(e); 
    return threadList; 
} 

Вы должны создать экземпляр этого списка только один раз, например, когда она была объявлена. Кроме того, вы определенно не должны использовать сырые типы как List, но всегда набранную версия:

private List<String> threadList = new ArrayList<>(); 

Обратите внимание, что в данном примере, вы на самом деле не с помощью каких-либо Thread или Runnable функцию (так как вы не переопределяете run() или начал тему). Также prefer implementing Runnable over extending Thread.

+0

Спасибо за это, я удалил threadList = новый ArrayList <>(); и объявлен закрытый список threadList = new ArrayList <>(); первоначально – Ingram

0

Вы создаете новый список массивов каждый раз, когда вы проходите цикл. Вот почему вы не видите элемент [0], так как он заменен новым списком.

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