2015-02-03 3 views
1

Я создал программу, которая создает массив случайных чисел и удваивает размер, если пользователь пытается добавить int. Пример: 1 | 2 | 3 | 4, если они должны были добавить еще один int, это выглядело бы как 1 | 2 | 3 | 4 | 5 | 0 | 0 | 0. Я создал метод для добавления int, который работает, но теперь я пытаюсь сделать методы, которые удаляют один из определенного int и другого, который удаляет все определенные int. например, removeInt (3) даст мне 1 | 2 | 0 | 4 | 5 | 0 | 0 | 0. У меня есть первая часть, работающая так, что она сдвигает нуль до конца как 1: 2 | 4 | 5 | 0 | 0 | 0 | 0, но не может заставить его работать более чем на одно значение. Какие-либо предложения?Смещение массива после удаления значения (Java)

// **************************************************************** 
// IntegerList.java 
// 
// Define an IntegerList class with methods to create & fill 
// a list of integers. 
// 
// **************************************************************** 

public class IntegerList 
{ 
    int[] list; //values in the list 
//------------------------------------------------------- 
//create a list of the given size 
//------------------------------------------------------- 
    public IntegerList(int size) 

    { 
     list = new int[size]; 
    } 
//------------------------------------------------------- 
//fill array with integers between 1 and 100, inclusive 
//------------------------------------------------------- 
    public void randomize() 
    { 
     for (int i=0; i<list.length; i++) 
      list[i] = (int)(Math.random() * 100) + 1; 
    } 
//-------------------------------------------==---------- 
//print array elements with indices 
//------------------------------------------------------- 
    public void print() 
    { 
     for (int i=0; i<list.length; i++) 
      System.out.println(i + ":\t" + list[i]); 
    } 
    public void addElement(int newVal){ 
     boolean full = true; 
     System.out.println(list.length); 
     int position = 0; 
     int place; 
     while(position < list.length){ 
      System.out.println("HERE"); 
       if(list[position]==0){ 
        System.out.println("here"); 
        full = false; 
        place = position; 
        System.out.println(place); 
       } 
       position = position+1; 
      } 
     if(full == true){ 
      list = increaseSize(list); 
      System.out.println("L"+list.length); 
      full = false; 
      } 

     for(int i = 0;i<list.length;i++){ 
      if(list[i]==0){ 
       if(i<position){ 
        position = i; 
      System.out.println(list.length); 
       } 
      } 
     } 
     list[position] = newVal; 
    } 
    public void removeFirst(int newVal){ 
     int position = 0; 
     boolean removed = false; 
     for(int i = 0; i<list.length;i++){ 
      if(list[i] == newVal){ 
       list[i]=0; 
       position = i; 
       removed = true; 
       break; 
      } 
     } 
     if(removed==true){ 
      for(int i = position;i<list.length;i++){ 
       if(i!=list.length-1){ 
        list[i]=list[i+1]; 
       } 
      } 
      list[list.length-1]= 0; 
     } 
    } 
    public void removeAll(int newVal){ 
     int position = 0; 
     boolean removed = false; 
     for(int i = 0; i<list.length;i++){ 
      if(list[i] == newVal){ 
       list[i]=0; 
       position = i; 
       removed = true; 
      } 
     } 
     if(removed==true){ 
      for(int i = 0;i<list.length;i++){ 
       if(i!=list.length-1 && list[i+1]==newVal){ 
        list[i]=0; 
       } 
       if(list[i]==newVal){ 
        list[i]=0; 
       } 
      } 
     } 
     } 
    public static int[] increaseSize(int[] x){ 
     int newLength = x.length *2; 
     int[] newx = new int[newLength]; 
     for(int i = 0; i<x.length; i++){ 
      newx[i] = x[i]; 
     } 
     return newx; 
    } 
    public static int[] halfSize(int[] x){ 
     int[] newx = new int[x.length/2]; 
     for(int i = 0; i<x.length; i++){ 
      newx[i] = x[i]; 
     } 
     return newx; 
    } 
} 
+0

Если методы 'removeFirst' работают, разве вы не можете просто называть его методом 'removeAll'? Возможно, removeFirst возвращает логическое значение для того, найден ли элемент для удаления или нет, поэтому, когда он возвращает false, вы знаете, что все готово? – DaaaahWhoosh

ответ

0

Я считаю, что есть более простой способ реализовать свой метод removeAll. Перемещайте 2 (а не 1) индексы через ваш массив, постоянно изменяя значения по элементам, которые вы удаляете;

int dest = 0; 
int source = 0; 
while (source < array.length) { 
    if (array[dest] != valueToRemove) 
     dest++; 
    array[dest] = array[source++]; 
} 
while (dest < array.length) { 
    array[dest++] = 0; 
} 
0

я выполнил свой код и выяснил, что проблема в этой части, под RemoveAll() ...

if(removed){ 
     for(int i = 0;i<list.length;i++){ 
      if(i!=list.length-1 && list[i+1]==newVal){ 
       list[i]=0; 
      } 
      if(list[i]==newVal){ 
       list[i]=0; 
      } 
     } 
    } 

Если закомментировать и попробовать один раз, вы увидите RemoveAll (), и ваше искомое число заменяется на 0. Теперь почему вы не просто проверяете свои номера и меняете (сортируете), если они больше 0 влево?