2016-05-06 2 views
2

Я работаю над этим методом, который должен возвращать новый Вектор с элементами, смещенными справа на заданное количество позиций. например:Смещение элементов вектора вправо

[1 2 3 4] 0 => [1 2 3 4]

[1 2 3 4] 1 => [4 1 2 3]

[1 2 3 4] 2 => [3 4 1 2]

[1 2 3 4] 3 => [2 3 4 1]

[1 2 3 4] 4 => [1 2 3 4]

[1 2 3 4] 5 => [4 1 2 3]

мой код работает с некоторыми входами, только для 0, 2 и 4, в то время как 1 и 3 не работают.

Вот мой код:

public Vector shifted(int amount) { 

    Vector v = new Vector(length); 

    for (int i = 0; i < length; i++) { 
     if (i + amount > length-1) { 
      v.elements[i] = this.elements[(i+amount) % length]; 
     } 
     else { 
      v.elements[i] = this.elements[(i+ amount)]; 
     } 
    } 
    return v; 
} 
+3

Почему вы используете [ 'VECTOR'] (https: // документы .oracle.com/JavaSE/8/документы/API/Java/Util/Vector.html)? Javadoc говорит: * Вместо 'Vector' рекомендуется использовать' ArrayList'. * Почему он является сырым? Дженерики были изобретены давно. – Andreas

+1

Мне кажется, что вы на самом деле смещаетесь влево, а не вправо. Являются ли те результаты, которые вы видите для 1 и 3? Если это так, то 0, 2 и 4 будут «работать», потому что 0 и 4 не выполняют никаких сдвигов, а 2 сдвинут половину массива и, следовательно, будет выглядеть одинаково независимо от того, сдвигаетесь ли вы влево или вправо. Я думаю, вы должны попробовать его с помощью карандаша и бумаги, посмотрите, какие именно индексы в 'v.elements' вы назначаете тем индексам в' this.elements'. Если вы это сделаете, вы сможете увидеть, как это исправить. Ты очень близко. – ajb

+0

все еще не работает, может у меня больше? пожалуйста ?? я потратил так много времени на это –

ответ

0

Вот рабочая версия, которая может обрабатывать любое значение amount.

public static <E> Vector<E> shifted(Vector<E> input, int amount) { 
    if (input.isEmpty()) 
     return new Vector<>(); 
    int shift = (amount % input.size() + input.size()) % input.size(); 
    if (shift == 0) 
     return new Vector<>(input); 
    Vector<E> v = new Vector<>(input.size()); 
    v.addAll(input.subList(input.size() - shift, input.size())); 
    v.addAll(input.subList(0, input.size() - shift)); 
    return v; 
} 

TEST

Vector<Integer> input = new Vector<>(Arrays.asList(1,2,3,4)); 
for (int i = -5; i <= 5; i++) 
    System.out.printf("%2d: %s%n", i, shifted(input, i)); 

ВЫВОД

-5: [2, 3, 4, 1] 
-4: [1, 2, 3, 4] 
-3: [4, 1, 2, 3] 
-2: [3, 4, 1, 2] 
-1: [2, 3, 4, 1] 
0: [1, 2, 3, 4] 
1: [4, 1, 2, 3] 
2: [3, 4, 1, 2] 
3: [2, 3, 4, 1] 
4: [1, 2, 3, 4] 
5: [4, 1, 2, 3] 
+1

Было бы более полезно объяснить, что не так с исходной реализацией, а просто дать рабочее решение дословно. Научите человека ловить рыбу и все такое. – dimo414

0

Стратегия сдвига применить неверен. Попытайтесь подумать, что произойдет, когда i = 0 и amount = 1 за Vector с length = 4: вы назначаете в позицию 0 значение в позиции 1, что является противоположностью того, чего вы хотите достичь.

Вот пример того, что вы хотите достичь в виде функции, которая принимает Vector и сдвиг amount:

public static Vector rightShiftVector(Vector v, int amount){ 
    int s = v.size(); 
    int a = (amount >= 0)?amount % s : amount % s + s; // or int a = (amount % s + s) % s 
    Vector result = new Vector(s); 
    for(int i = 0; i < s; i++){ 
     int p; 
     if(i + a < s){ 
      p = i; 
     } 
     else{ 
      p = (i + a) % s; 
     } 
     result.insertElementAt(v.get(i), p); 
    } 

    return result; 
} 
+0

Не работает для отрицательных значений 'amount'. – Andreas

+0

FYI: Решение довольно просто. Скажем, 's' равно 4. Для большого значения' amount' 11, вы используете '% s', чтобы свести его до 3. Все хорошо.Для большого * отрицательного * значения -9, '% s' сводит его к -1, что означает сдвиг 1 влево. Но 1 слева - то же, что и 3 справа, поэтому '+ s' приносит его 3. Великолепно. Поэтому добавьте 'if (a <0) a + = s'. * Или: * Всегда делайте 'a + = s', но это делает положительный ход слишком высоким, так что' a% = s', который работает, потому что '(a + s)% s == a' для положительных значений' a'. Все вместе вы просто пишете 'a = (сумма% s + s)% s', и вы можете обрабатывать все значения' amount'. – Andreas

+0

спасибо за ваш комментарий, Андреас. Я сосредоточился исключительно на правильном (положительном) сдвиге. Я обновил ответ, чтобы обработать негативный (левый) сдвиг. – Danilo

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