2015-01-25 2 views
-3

я делал в прошлом CCC (канадский Computing конкурс) вопрос, и я получил странные ошибки, которые, когда я использую IndexOf() до целого числа в ArrayList она возвращает 0.Java IndexOf (целое) возвращает 0

Здесь это код:

package problem4; 

import java.util.ArrayList; 
import java.util.List; 
import java.util.Scanner; 
import java.util.concurrent.CopyOnWriteArrayList; 

public class Problem4 { 

    static List<Integer> totalnum = new CopyOnWriteArrayList<>(); 
    static ArrayList<Integer> div = new ArrayList<>(); 
    static String output = ""; 

    public static void main(String[] args) { 

     Scanner in = new Scanner(System.in); 

     try { 
      int total = in.nextInt(); 
      for (int i = 0; i < total; i++) { 
       totalnum.add(i + 1); 
      } 

      int roundnum = in.nextInt(); 
      for (int i = 0; i < roundnum; i++) { 
       int tempnum = in.nextInt(); 
       div.add(tempnum); 
      } 

      print("cache org: " + totalnum.toString()); 
      for (int divnum : div) { 
       for (int check : totalnum) { 
        print(check + " index: " + totalnum.indexOf(check)); 
        if (totalnum.indexOf(check) % divnum == 0) { 
         totalnum.remove(totalnum.indexOf(check)); 
        } 
       } 
       print("cache " + divnum + ": " + totalnum.toString()); 
      } 

      String output = totalnum.toString().replace("[", "") 
        .replace("]", "").replace(",", ""); 

      for (int i = 0; i < output.length(); i++) { 
       System.out.println(output.charAt(i)); 
      } 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 

    public static void print(String input) { 
     System.out.println(input); 
    } 

} 

А вот вход/выход:

10 
2 
2 
3 
cache org: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
1 index: 0 
2 index: 0 
3 index: 0 
4 index: 0 
5 index: 0 
6 index: 0 
7 index: 0 
8 index: 0 
9 index: 0 
10 index: 0 
cache 2: [] 
cache 3: [] 

Кто-нибудь знает, что это не так?

+2

Ну, так как вы удаляете элементы на каждой итерации, индекс всегда будет равен нулю. –

+0

Единственным сюрпризом здесь является отсутствие исключения ConcurrentModificationException. Фактически, я утверждаю, что это на самом деле объясняет немотивированное использование «CopyOnWriteArrayList»: OP используется для получения этого исключения, но вместо его исправления он изменил реализацию. –

+0

@MarkoTopolnik Это потому, что это 'CopyOnWriteArrayList'. –

ответ

1

Вы удаляете первый элемент после каждой итерации, поэтому следующий элемент становится первым. Просто распечатайте содержимое массива после каждой итерации:

for (int divnum : div) { 
    for (int check : totalnum) { 
     print(check + " index: " + totalnum.indexOf(check)); 
     if (totalnum.indexOf(check) % divnum == 0) { 
       totalnum.remove(totalnum.indexOf(check)); 
     } 
     print("cache " + divnum + ": " + totalnum.toString()); 
    } 
    print("cache " + divnum + ": " + totalnum.toString()); 
} 

Тогда для ввода вы увидите такой вывод

cache org: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
1 index: 0 
cache org: [2, 3, 4, 5, 6, 7, 8, 9, 10] 
2 index: 0 
cache org: [3, 4, 5, 6, 7, 8, 9, 10] 
3 index: 0 
cache org: [4, 5, 6, 7, 8, 9, 10] 
4 index: 0 
cache org: [5, 6, 7, 8, 9, 10] 
5 index: 0 
cache org: [6, 7, 8, 9, 10] 
6 index: 0 
cache org: [7, 8, 9, 10] 
7 index: 0 
cache org: [8, 9, 10] 
8 index: 0 
cache org: [9, 10] 
9 index: 0 
cache org: [10] 
10 index: 0 
cache org: [] 
cache 2: [] 
cache 3: [] 
Смежные вопросы