将向量元素向右移动

时间:2016-05-06 06:09:15

标签: java class arraylist vector

我正在研究这个方法,它应该返回一个新的Vector,其元素向右移动一定数量的位置。例如:

  

[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;
 }

2 个答案:

答案 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 :(得分:0)

您应用的转换策略不正确。尝试考虑i = 0amount = 1 Vectorlength = 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;
}