2014-01-31 3 views
-3

Я пытаюсь изменить список массивов, который передается в метод. Я могу только изменить этот список массивов, не создавая в этом методе новый список массивов.изменить список массивов

здесь проблема:

Напишите метод stutter, который принимает ArrayList из Strings и integerk в качестве параметров и заменяет каждую строку к экземплярам этой строки. Например, если список сохраняет значения ["how", "are", "you?"] перед вызовом метода и k равен 4, он должен сохранить значения ["how", "how", "how", "how", "are", "are", "are", "are", "you?", "you?", "you?", "you?"] после завершения метода. Если k равно 0 или отрицательный, список должен быть пустым после вызова.

Один из способов сделать это с созданием нового списка массива:

public static void stutter(ArrayList<String> list, int k) { 
    ArrayList<String> a = new ArrayList<String>(); 
    String s = ""; 
    if(k > 0) { 
     for(int i = 0; i < list.size(); i++) { 
      s = list.get(i); 
      for(int j = 0; j < k; j++) { 
       a.add(s); 
      } 
     } 
    } 
} 

Что один способ изменить что ArrayList<String> list только без создания нового списка массива? спасибо

+3

Um, call 'list.add (...)'? –

+0

Используйте 'list' вместо' a' внутри вашего метода, хотя обратите внимание, что это, как правило, не очень хорошая идея, так как это может вызвать проблемы позже, гораздо лучше вернуть новый. – turbo

+0

Помните, что вы хотите изменить цикл for на 'j

ответ

1
public static void addItem(List<String> list, int k){ 
    int size = list.size() * k; 

    for (int i=0; i<size; i=i+k){ 
     String s = list.get(i); 
     for (int j=0; j<k-1; j++){ 
      list.add(i+j, s); 
     } 
    } 
} 
+0

приятно спасибо. – user3256022

0

Вы можете сохранить размер ArrayList переменной перед итерацией.

int size = list.size(); 
for(int i=0; i<k; i++){ 
    for(int j=0; j<size; j++){ 
     list.add(list.get(j)); 
    } 
} 

Однако, для примера, список будет ["how","are","your","how","are","your","how","are","your","how","are","your"]. Если вы хотите, то же самое значение, чтобы быть вместе:

int size = list.size(); 
for(int i=0;i<size;i++){ 
    String s = list.get(i*k); 
    for(int j=0;j<k-1;j++){ 
     list.add(i*k+j, s); 
    } 
} 
0
public static void addItem(List<String> list, int k) { 

    int size = list.size(); 

    for (int i = 0; i < size * (k - 1); i++) { 
     list.add(""); 
    } 

    for (int i = size - 1; i >= 0; i--) { 
     for (int m = k - 1; m >= 0; m--) { 
      list.set(k * i + m, list.get(i)); 
     } 
    } 

} 

Этот подход будет поддерживать два указателя, пополняя список назад, без какого-либо смещения участие.

-1
public static void stutter(ArrayList<String> list, int k) { 
    if (k <= 0) { 
        list.clear(); 
    } 
    for (int i = list.size() - 1; i >= 0; i--) { 
     for (int r = 1; r < k; r++) { 
      list.add(i + 1, list.get(i)); 
     } 
    } 
} 
+1

Хотя этот блок кода может ответить на вопрос, было бы лучше объяснять, если бы вы могли предоставить некоторые причины, почему это так. – DavidPostill

+0

Во-первых, вы хотите начать с базового случая, а именно, когда k меньше или равно нулю. Как указано в проблеме, если это произойдет, вы хотите вернуть пустой список. Начиная с конца списка, вы никогда не теряете свое место в списке. добавьте k (эксклюзивные) строки в список, после того как вы закончите, вы переходите к следующему слову, пока не увидите первый индекс. Я нашел O (N) способ сделать это тоже, если кто-то заинтересован в этом. – Dylan

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