2014-02-03 4 views
0

Я написал программу для сортировки массива на четные и нечетные числа, используя ArrayList класса, но когда я попытался отобразить два ArrayLists через дисплей метода не выход , примечание: -, когда я пытаюсь отобразить их в методе классификации, все идет хорошо. здесь мой класс ..Сортировка массива с четным и нечетными номерами

import java.util.*; 
public class SortNumbers{ 
    private static int[] array = {8,78,20,3,27,30,45,25,14}; 
    private static List<Integer> even = new ArrayList<>(); 
    private static List<Integer> odd = new ArrayList<>(); 

    public static void classify(int[] arr, List even , List odd){ 
     even = new ArrayList<Integer>(); 
     odd = new ArrayList<Integer>(); 
     for(int i = 0 ; i < arr.length ; i++){ 
      if(arr[i] % 2 == 0) 
       even.add(arr[i]); 

      else 
       odd.add(arr[i]); 
     } 
    } 

    public static void display(List<Integer> list){ 
     for(Integer i : list) 
      System.out.println(i); 
    } 

    public static void main(String[] args){ 
     classify(array,even,odd); 
     display(even); 
    } 
} 

Я не могу понять причину ??

+0

@Mike Если вы скопируете код в сборке, это может быть так - в Java вы можете рассчитывать на JVM для выполнения такой оптимизации ... – assylias

+0

Просто понял, что это для Java. К сожалению, оптимизация действительно выполняется компилятором. – Mike

ответ

2

Это потому, что ваш список even пуст: вы создаете локальную переменную в classify, которая скрывает статическое поле.

Просто удалите:

even = new ArrayList<Integer>(); 
odd = new ArrayList<Integer>(); 

из вашего КЛАССИФИЦИРУЙТЕ метода.

2

Вам не нужно передавать массивы вокруг или переинициализировать их:

import java.util.*; 
public class SortNumbers{ 
    private static int[] array = {8,78,20,3,27,30,45,25,14}; 
    private static List<Integer> even = new ArrayList<>(); 
    private static List<Integer> odd = new ArrayList<>(); 

    public static void classify(){ 
     for(int i = 0 ; i < array.length ; i++){ 
      if(array[i] % 2 == 0) 
       even.add(array[i]); 

      else 
       odd.add(array[i]); 
     } 
    } 

    public static void display(List<Integer> list){ 
     for(Integer i : list) 
      System.out.println(i); 
    } 

    public static void main(String[] args){ 
     classify(); 
     display(even); 
    } 
} 
1

Эти локальные объекты с локальной ссылкой у созданных, которые становятся уничтожены, когда функция заканчивается в вашем КЛАССИФИЦИРУЙТЕ метод с таким же именем, как например членов

even = новый ArrayList();

нечетный = новый ArrayList();

public static void classify(int[] arr, List even , List odd){ 
       // even = new ArrayList<Integer>(); local reference created with same name as instance member 
       // odd = new ArrayList<Integer>(); local reference created with same name as instance member 
       for(int i = 0 ; i < arr.length ; i++){ 
        if(arr[i] % 2 == 0) 
         even.add(arr[i]); 

        else 
         odd.add(arr[i]); 
       } 
      } 
1

Вам нужно будет удалить:

even = new ArrayList<Integer>(); 
odd = new ArrayList<Integer>(); 

и

удалить также все параметры из КЛАССИФИЦИРОВАТЬ. Так оно и должно выглядеть так:

public static void classify(){ 

    for(int i = 0 ; i < arr.length ; i++){ 
     if(arr[i] % 2 == 0) 
      even.add(arr[i]); 

     else 
      odd.add(arr[i]); 
    } 
} 

статические параметры не должны быть переданы в метод, как вы создаете локальные копии, пытаясь сделать это.

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