2014-06-23 2 views
0

У меня есть ArrayList объекта подобного: [объект 1, объект 2, NULL, NULL, .., пустой, объект 3, NULL, NULL]Размещение нуль в конце списка

я стараюсь переместите объект 3 после объекта 2 без удаления «нулевого случая», но он не работает. Поэтому я хотел бы перебрать свой массивList справа налево и проверить, не имеет ли значение значение null, а затем переместить объект 3 за объект 2. Я точно знаю, что я не знаю число «нулевого случая» между объектом 2 и объектом 3

Я стараюсь писать так:

ArrayList<Type> subList = new ArrayList<Type>(); 

for (int i = 0; i < array.size(); i++) { 
    subList = array.get(i); 
    for (int j = subList.size(); j >=0 ; j--) { 
     if(subList.get(j)!=null) { 
      Collections.swap(subList, j, j-1); 
     }      
    } 
} 

редактировать:

раствор 1: что работает для моего проекта

for(int i=0;i<subList.size();i++) 
    if(subList.get(i)!=null) { 
     for(int j=0;j<i;j++) { 
      if (subList.get(j)==null) { 
       Collections.swap(subList,i,j); 
       break; 
      } 
     } 
    } 
} 

решение 2: копию в другой ArrayList не работает для моего проекта, не знает, почему

List<String> strings = Arrays.asList(new String[]{"A", null, "B"}); 
List<String> result = new ArrayList<String>(); 

for(String string : strings) { 
    if(string != null) 
     result.add(string);   
} 

for (int i = 0, remaining = strings.size() - result.size(); i < remaining; i++) { 
    result.add(null); 
} 
+2

почему бы просто не сортировать ArrayList? – TheLostMind

+0

На самом деле я хотел бы сохранить все «случай» и поместить themat в конец массиваList – user3748551

+2

Сделайте именно это: Итерайте в списке, удалите каждый пустой элемент (и помните, сколько вы удалили), затем повторно добавьте N null в конце списка. –

ответ

0

Update 2:

Для переключения между объектом с нашим созданием любого нового списка, используйте Collections.swap(); Что-то вроде этого:

public static void main(String[] args) { 

    ArrayList subList = new ArrayList(); 
    subList.add("1"); 
    subList.add("2"); 
    subList.add(null); 
    subList.add(null); 
    subList.add("3"); 

    for(int i=0;i<subList.size();i++) 
     if(subList.get(i)!=null) { 
      for(int j=0;j<i;j++) { 
       if (subList.get(j)==null) { 
        Collections.swap(subList,i,j); 
        break; 
       } 
      } 
     } 
    } 
} 

Update 1:

Попробуйте это:

public static void main(String[] args) { 
    ArrayList subList = new ArrayList(); 
    subList.add("1"); 
    subList.add("2"); 
    subList.add(null); 
    subList.add(null); 
    subList.add("3"); 
    subList=leftShift(subList); 
} 

public static ArrayList leftShift(ArrayList x){ 
    ArrayList temp=new ArrayList(); 
    int count=0; 
    for(Object t:x){ 
     if(t!=null) 
      temp.add(t); 
     else 
      count++; 
    } 
    for (int i=0;i<count;i++) 
     temp.add(null); 
    return temp; 
} 
+0

Намерение, вероятно, было изменить данный список, а не создавать новый. – Marco13

+0

@ Marco13 Проверьте мое второе обновление. –

+0

Предлагаемые здесь решения все имеют O (nlogn) или даже O (n * n). Я просто поддержал http://stackoverflow.com/a/17762203/3182664, поскольку он представляется наиболее сжатым и эффективным решением. – Marco13

0

раствор из верхней части моей головы, не блестящий, но это позволит вам сохранить порядок

int nullIndex = -1; 
for (int i = 0; i < list.size(); i++) { 
    if (nullIndex==-1 && list.get(i) == null) { 
     System.out.println("nullIndex ="+i); 
     nullIndex = i; 
    } else if (nullIndex >= 0 && list.get(i) != null) { 
     System.out.println("swap ="+i+" "+nullIndex); 

     list.set(nullIndex, list.get(i)); 
     list.set(i, null); 
     i = nullIndex; 
     nullIndex=-1; 
    } 
} 

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

int counter=0; 
while(subList.contains(null)){ 
    subList.remove(null); 
    counter++; 
}; 
while(counter>0){ 
    subList.add(null); 
    counter--; 
} 
Смежные вопросы