方法public static <T> ArrayList<T> rotate(ArrayList<T> aL, int shift)
接受Arraylist
字符串(至少在此示例中)和shift
表示arraylist应该移位多少。如果有的话,让我们说arayList of
[ A, B, C, D, E, F, G]
并且班次为2
,因此该方法返回
[ F, A, B, C, D, E]
或其他例子,
[ A, B, C, D, E, F, G]
且shift
为4
,然后方法返回
[ D, E, F, G, A, B, C]
我完全错误地完成了这个方法,并且不知道如何解决这个问题。 smb可以帮我吗?
import java.util.ArrayList;
public class Rotation{
// Demonstrate rotat(a,shift) method
public static void main(String arg[]){
ArrayList<Character> charsL;
charsL = new ArrayList<Character>();
char [] chars = { 'A', 'B', 'C',
'D', 'E', 'F'};
for(char c : chars){
charsL.add(c);
}
// charsL = [ A, B, C, D, E, F]
ArrayList<Character> result1;
result1 = rotate(charsL, 2);
// result1== [ E, F, A, B, C, D]
System.out.println(result1);
result1 = rotate(charsL, 7);
// result1== [ F, A, B, C, D, E]
System.out.println(result1);
// WORKS WITH SRTINGS TOO
ArrayList<String> stringL;
stringL = new ArrayList<String>();
String [] strs = { "A", "B", "C",
"D", "E", "F", "G" };
for(String s : strs){
stringL.add(s);
}
// stringL = [ A, B, C, D, E, F, G]
ArrayList<String> result2;
result2 = rotate(stringL, 7);
// result2== [ A, B, C, D, E, F, G]
System.out.println(result2);
result2 = rotate(stringL, 4);
// result2== [ D, E, F, G, A, B, C]
System.out.println(result2);
}
public static <T>
ArrayList<T> rotate(ArrayList<T> aL, int shift){
// YOUR DEFINITION HERE
ArrayList <T> newValues = new ArrayList<>();
ArrayList <T> temp = new ArrayList<>();
for(int i = 0; i < aL.size(); i++)
{
newValues.remove(aL.get(shift));
newValues.add(aL.get(i));
//newValues.add(shift, aL.get(i));
}
return newValues;
}
}
答案 0 :(得分:9)
如果您可以使用内置解决方案,那么您的代码可以像
一样简单public static <T> List<T> rotate(List<T> aL, int shift) {
List<T> newValues = new ArrayList<>(aL);
Collections.rotate(newValues, shift);
return newValues;
}
答案 1 :(得分:2)
试试这个:
public static <T> ArrayList<T> rotate(ArrayList<T> aL, int shift)
{
if (aL.size() == 0)
return aL;
T element = null;
for(int i = 0; i < shift; i++)
{
// remove last element, add it to front of the ArrayList
element = aL.remove( aL.size() - 1 );
aL.add(0, element);
}
return aL;
}
答案 2 :(得分:2)
试试这个:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class ALUtils {
public static <T> ArrayList<T> rotate(List<T> aL, int shift) {
ArrayList<T> newValues = new ArrayList<>(aL);
Collections.rotate(newValues, shift);
return newValues;
}
}
测试案例:
// Public tests for ALUtils
import org.junit.*;
import static org.junit.Assert.*;
import java.util.*;
import java.io.*;
public class ALUtilsTests {
/*Main method runs tests in this file*/
public static void main(String args[]) {
org.junit.runner.JUnitCore.main("Tests");
}
public <T> void checkRotate(T d[], int shift, String expectS){
ArrayList<T> a = new ArrayList<T>();
a.addAll(Arrays.asList(d));
String sourceBefore = a.toString();
ArrayList<T> actualA = ALUtils.rotate(a, shift);
String sourceAfter = a.toString();
String actualS = actualA.toString();
String msg =
String.format("Rotation incorrect\n")+
String.format("Source : %s (before rotate)\n",sourceBefore)+
String.format("Shift : %d\n",shift)+
String.format("Expect : %s\n",expectS)+
String.format("Actual : %s\n",actualS)+
String.format("Source : %s (after rotate)\n",sourceAfter);
assertEquals(msg,expectS,actualS);
assertEquals(msg,sourceBefore,sourceAfter);
}
@Test public void test_rotate1() {
Character [] d = { 'A', 'B', 'C', 'D', 'E', 'F'};
int shift = 2;
String expectS = "[E, F, A, B, C, D]";
checkRotate(d,shift,expectS);
}
@Test public void test_rotate2() {
Character [] d = { 'A', 'B', 'C', 'D', 'E', 'F'};
int shift = 7;
String expectS = "[F, A, B, C, D, E]";
checkRotate(d,shift,expectS);
}
@Test public void test_rotate3() {
String [] d = { "A", "B", "C", "D", "E", "F", "G" };
int shift = 7;
String expectS = "[A, B, C, D, E, F, G]";
checkRotate(d,shift,expectS);
}
@Test public void test_rotate4() {
String [] d = { "A", "B", "C", "D", "E", "F", "G" };
int shift = 4;
String expectS = "[D, E, F, G, A, B, C]";
checkRotate(d,shift,expectS);
}
@Test public void test_rotate5() {
Integer [] d = { 1};
int shift = 4;
String expectS = "[1]";
checkRotate(d,shift,expectS);
}
@Test public void test_rotate6() {
Integer [] d = {};
int shift = 2;
String expectS = "[]";
checkRotate(d,shift,expectS);
}
@Test public void test_rotate7() {
String [] d = { "A", "B", "C", "D", "E", "F", "G" };
int shift = 0;
String expectS = "[A, B, C, D, E, F, G]";
checkRotate(d,shift,expectS);
}
@Test public void test_rotate8() {
String [] d = { "A", "B", "C", "D", "E", "F", "G" };
int shift = 28;
String expectS = "[A, B, C, D, E, F, G]";
checkRotate(d,shift,expectS);
}
@Test public void test_rotate9() {
String [] d = { "A", "B", "C", "D", "E", "F", "G" };
int shift = 39;
String expectS = "[D, E, F, G, A, B, C]";
checkRotate(d,shift,expectS);
}
}
答案 3 :(得分:1)
目前还不清楚为什么要保留calling aL.get(shift)
以及为什么要继续从列表中删除,只应该添加。
尝试:
public static <T> ArrayList<T> rotate(ArrayList<T> l, int shift) {
List<T> left = l.subList(0, aL.size() - shift);
List<T> right = l.subList(aL.size() - shift, l.size());
List<T> res = new ArrayList<T>(right);
res.addAll(left);
return res;
}