逆转变化
对于我第二学期的Java课程,我们目前正在进行一个项目,该项目通过随机生成的数字移动字符数组。因此,如果计算机生成数字2,而字符是"nick",它将返回为"ckni"。我可以把元素移到前面,但是我不知道怎么把元素从末尾移到前面。有人能帮我一下吗?
根据您开始使用的数据类型,有几种方法可以进行转换。
String
int shift = 2;
String str = "nick";
int pos = str.length() - shift;
// outputs 'ckni'
System.out.println(str.substring(pos, str.length()) + str.substring(0, pos));
List<Character>
List<Character> list = Arrays.asList('n', 'i', 'c', 'k');
Collections.rotate(list, shift);
// outputs [c, k, n, i]
System.out.println(list);
Character[]
Character[] array = {'n', 'i', 'c', 'k'};
Collections.rotate(Arrays.asList(array), shift);
// outputs 'ckni'
System.out.println(Arrays.asList(array));
char[]
char[] carray = {'n', 'i', 'c', 'k'};
char[] rotated = new char[carray.length];
int pos = carray.length - shift;
System.arraycopy(carray, 0, rotated, shift, pos);
System.arraycopy(carray, pos, rotated, 0, shift);
// outputs 'ckni'
System.out.println(rotated);
逆转变化
如果你把shift
包在模运算符中,它将确保正确的边界,也允许你使用负值进行反向移位:
// shifts left by two
int shift = -2;
shift = (shift%str.length() + str.length())%str.length();
像前面提到的那样将所有内容向前移动,但要跟踪索引计数器。如果建议您转移到>= length的索引,则从索引
中减去长度。int shift = Random.nextInt(length);
char first = myarray[0];
int newindex = 0;
for(int i=0; i<myarray.length - 1; i++){
int oldindex = newindex;
newindex = newindex + shift;
if(newindex >= myarray.length){
newindex = newindex - myarray.length;
}
myarray[oldindex] = myarray[newindex];
}
myarray[newindex] = first;