2016-04-13 4 views
0

Я изучаю использование ArrayList s и PrintWriter s на данный момент, и мой профессор назначил нам что-то, где мы должны разбить файл с использованием нескольких PrintWriter s, хранящихся в ArrayList. Поэтому я инициализировать Printwriter с, а для цикла, который выглядит примерно так:ArrayList of PrintWriters и метод .get()

for (int i=1; i<=n; i++) { 
    try { 
    this.writers.add(new PrintWriter(new File(filePattern + i))); 
    } 
    catch (java.io.IOException e) { 
    System.out.println("File " + i + " not found."); 
    } 
} 

где writers является ArrayList<PrintWriter> и filePattern является источником. Но в моем методе write я должен позвонить этим PrintWriter s, чтобы на самом деле написать что-то. Используя int currentFile, я поворачиваю файлы, чтобы их разбить, но я не совсем уверен, как использовать PrintWriter, который находится в ArrayList, когда я его не назвал. Могу ли я использовать метод «get» следующим образом? :

public void write (String s) throws IOException { 
    if (this.writers.size() > 0) { 
    PrintWriter p = this.writers.get(currentFile); 
    p.println(s); 

    if (this.currentFile == (this.writers.size()-1)) { 
     this.currentFile = 0; 
    } 
    else { 
     this.currentFile++; 
    } 
    } 
    else { 
    System.out.println("No Writers currently exist"); 
    } 
} 

Или это не сработает? А если нет, есть ли другой путь?

ответ

0

Вы можете сделать this.writers.get(this.currentFile) или this.writers[this.currentFile], которые все еще может привести к IndexOutOfBoundsException, если вы не проверить, является ли this.currentFile между 0 и this.writers.size()-1. Это должно работать для последовательного (то есть непараллельного) выполнения.

Кроме того, я советую использовать геттеры для доступа к вашим данным (то есть currentFile) и сеттерам для изменения ваших данных даже в методах членов, поскольку он более чист.

+0

Хм, да, я привык использовать их, но по какой-то причине он не указал его, как в последних заданиях, поэтому мне кажется, что он может захотеть, чтобы мы не использовали их для этого? Я не знаю, но я не хочу рисковать. .get() должен работать? Как и в моем примере, он должен функционировать должным образом? – Azmera

+0

@Azmera, если вы помещаете ссылки на объекты в список и хотите получить доступ к этим ссылкам объектов посредством индексации, вы можете использовать явный метод get member или перегруженный оператор [] (что является точно таким же «синтаксическим сахаром»). Просто взгляните на API: https://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html – Matthias