我正在研究这个方法,它应该返回一个新的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;
}
答案 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 = 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;
}