如果我有一个数组,例如这个
mydata <- read.table(header=TRUE, text="
Active hor plot mng
7.20 F 1 CH
8.80 O 1 CH
9.30 F 1 CH
9.20 O 1 CH
9.70 F 1 CH
9.30 O 1 CH
9.10 F 2 CH
7.50 O 2 CH
7.50 F 2 CH
8.70 O 2 CH
9.90 F 2 CH
7.60 O 2 CH
9.70 F 3 CH
7.70 O 3 CH
8.90 F 3 CH
8.60 O 3 CH
8.30 F 3 CH
8.30 O 3 CH
8.50 L 1 CH
7.40 L 1 CH
8.00 L 1 CH
9.70 L 2 CH
8.90 L 2 CH
8.40 L 2 CH
9.80 L 3 CH
8.00 L 3 CH
7.00 L 3 CH
7.30 F 1 Fe
6.60 O 1 Fe
6.50 F 1 Fe
6.60 O 1 Fe
6.90 F 1 Fe
5.80 O 1 Fe
6.60 F 2 Fe
7.00 O 2 Fe
6.00 F 2 Fe
5.10 O 2 Fe
6.10 F 2 Fe
5.10 O 2 Fe
5.10 F 3 Fe
6.50 O 3 Fe
7.70 F 3 Fe
6.90 O 3 Fe
5.20 F 3 Fe
6.30 O 3 Fe
6.50 L 1 Fe
5.00 L 1 Fe
7.80 L 1 Fe
5.10 L 2 Fe
5.50 L 2 Fe
5.60 L 2 Fe
5.50 L 3 Fe
7.80 L 3 Fe
7.70 L 3 Fe
7.20 F 1 W
8.80 O 1 W
7.80 F 1 W
7.80 O 1 W
7.90 F 1 W
8.10 O 1 W
8.60 F 2 W
7.40 O 2 W
7.40 F 2 W
8.40 O 2 W
7.70 F 2 W
8.90 O 2 W
6.70 F 3 W
6.10 O 3 W
7.50 F 3 W
8.60 O 3 W
7.80 F 3 W
8.60 O 3 W
8.30 L 1 W
8.20 L 1 W
8.70 L 1 W
8.60 L 2 W
6.80 L 2 W
6.30 L 2 W
7.30 L 3 W
7.10 L 3 W
7.70 L 3 W
")
如何按值更改每个元素的位置,例如,如果按1,Dim Players() As String = {"Adam", "Helen", "Jack", "Emily"}
将移至2,Adam
将移至3,Helen
应该来回到1。
如果增加1,我能够做到这一点。我将最后一个元素存储在变量中,当完成将所有元素移动1时,我会将第一个元素设置为变量(在本例中为Emily)。 / p>
如果有不同的增量值,如2,3,4或甚至6?
,我该怎么做?编辑:任何编程语言都可以,但必须使用for循环而不是函数。
更新:我是一名IGCSE学生,这个问题已经超过一周了。
答案 0 :(得分:0)
您指的是圆阵列旋转。
在VB.NET中,以下代码将按Shift量将元素数组旋转到右侧。
Sub Main()
Dim Players() As String = {"Adam", "Helen", "Jack", "Emily"}
Dim Players_Shifted(Players.Length - 1) As String
Dim Shift As Integer = 2
If Shift > Players.Length Then
Shift = Shift Mod Players.Length
End If
For index = 0 To Shift - 1
Players_Shifted(index) = Players(Players.Length - Shift + index)
Next
Dim index_2 = 0
For index = Shift To Players.Length - 1
Players_Shifted(index) = Players(index_2)
index_2 = index_2 + 1
Next
Players = Players_Shifted
' Print out Players Array '
For index = 0 To Players.Length - 1
Console.Write(Players(index) + ", ")
Next
Console.ReadLine()
End Sub
答案 1 :(得分:0)
如果你可以增加1,只需重复所需的次数。
更好的方法是:(让我们调用增量 n );将结束 n 元素存储在另一个数组中;在此之前将元素移动到数组的末尾;将元素从另一个数组复制回到开头。像这样:
Module Module1
Sub Main()
Dim players() As String = {"Adam", "Becky", "Clive", "Debby", "Edward", "Fiona"}
Dim rotateBy = 2
' make sure shiftBy is in a usable range
rotateBy = rotateBy Mod players.Length
' if shiftBy is negative, make it positive such that a left-rotate is performed
If rotateBy < 0 Then
rotateBy = rotateBy + players.Length
End If
' store the elements which will be moved to the other end of the array
Dim tmp(rotateBy - 1) As String
Dim startIndex = players.Length - rotateBy
For i = startIndex To players.Length - 1
tmp(i - startIndex) = players(i)
Next
' move the elements
For i = players.Length - 1 - rotateBy To 0 Step -1
players(i + rotateBy) = players(i)
Next
'fill in the other elements
For i = 0 To rotateBy - 1
players(i) = tmp(i)
Next
' show the result
Console.WriteLine(String.Join(", ", players))
Console.ReadLine()
End Sub
End Module
请注意,players
数组中元素的复制是向后完成的,因此重叠范围不会覆盖尚未移动的值。
要向后移动元素,请使用rotateBy
的负值。
如果您使用的语言具有提供数组复制功能的功能,则此方法很容易适应使用该功能。对于任何想知道未来的人:
Module Module1
Sub Main()
Dim players() As String = {"Adam", "Becky", "Clive", "Debby", "Edward", "Fiona"}
Dim rotateBy = 4
' make sure shiftBy is in a usable range
rotateBy = rotateBy Mod players.Length
' if shiftBy is negative, make it positive such that a left-rotate is performed
If rotateBy < 0 Then
rotateBy = rotateBy + players.Length
End If
' store the elements which will be moved to the other end of the array
Dim tmp(rotateBy - 1) As String
Dim startIndex = players.Length - rotateBy
Array.Copy(players, startIndex, tmp, 0, rotateBy)
Array.Copy(players, 0, players, rotateBy, startIndex)
Array.Copy(tmp, players, tmp.Length)
' show the result
Console.WriteLine(String.Join(", ", players))
Console.ReadLine()
End Sub
End Module
正如你提到的任何编程语言,这就是它在C#中作为一个函数,但不使用任何框架方法,如Array.Copy
:
public static void RotateUsingLoops<T>(T[] elements, int rotateBy)
{
rotateBy = rotateBy % elements.Length;
if (rotateBy < 0)
{
rotateBy += elements.Length;
}
T[] tmp = new T[rotateBy];
int startIndex = elements.Length - rotateBy;
// store the elements which will be moved to the other end of the array
for (int i = startIndex; i < elements.Length; i++)
{
tmp[i - startIndex] = elements[i];
}
// move the elements
for (int i = elements.Length - 1 - rotateBy; i >= 0; i--)
{
elements[i + rotateBy] = elements[i];
}
// fill in the other elements
for (int i = 0; i < rotateBy; i++)
{
elements[i] = tmp[i];
}
}
你可以使用
static void Main(string[] args)
{
var a = new string[] { "A", "B", "C", "D" };
RotateUsingLoops(a, 2);
Console.WriteLine(string.Join(", ", a));
Console.ReadLine();
}
获得输出:
C,D,A,B
答案 2 :(得分:-1)
以下是实现此功能的C ++代码片段 -
设temp为临时变量,N为数组的大小,shift为您想要移位的位数, arr 为原始数组。
int temp = arr[0];
int i = 0;
while(True){
//swap(arr(i + shift)%N, temp);
swap_var = temp;
temp = arr[(i+shift)%N];
arr[(i+shift)%N] = swap_var;
i = (i+shift)%N;
if (i == 0){
break;
}
}
编辑:使用for循环。
int temp = arr[0]; //change int to the type of variable ur array is
int i =0;
for (int count = 0; count<N ; count++){
//swap(arr(i + shift)%N, temp);
swap_var = temp;
temp = arr[(i+shift)%N];
arr[(i+shift)%N] = swap_var;
i = (i+shift)%N;
}