2015-08-12 2 views
2

я написал код, который сдвигает содержимое ArrayList вправо и смещение может быть любое число, переданная метода shiftRight(String myString, int shift) Внутри метода, мне нужно поставить каждый char пройденного String в ArrayList myList.Shifting содержимого `ArrayList` к правым

Например, если у меня есть

"abcdef", 2 

результат должен быть

efabcd 

, как он перемещается 2 буквы вправо. Другой пример:

"abcdef", 4 

то выход

cdefab 

Мой код дает edabcf, когда сдвиг 2 и String является "abcdef" тогда она должна производить efabcd. Coulb smb, пожалуйста, помогите мне? Я попытался отладить его, но все еще не мог понять, почему он принимает d вместо f. Заранее спасибо!


Логика кода:

1) Поместите каждый символ внутри ArrayList myList, запустив for - loop

2) Я присвоено значение shift к временному count, который декрементах внутри while-loop. Внутри while-loop я добавил символ, который будет удален в ближайшее время, до ArrayList temp от myList (если shift - 2, то символы ef добавляются к temp). Затем удалите эти символы из myList внутри того же цикла.

3) Добавлены символы из temp списка в myList


import java.util.ArrayList; 


public class ShiftToTheRight { 

    public static void main(String[] args){ 

     String myString = "abcdef"; 
     int shift = 2; 
     ArrayList<String> myList = shiftRight(myString, shift); 
     for(int i = 0; i < myList.size(); i++){ 
      System.out.print(myList.get(i) + ""); 
     } 
    } 

    public static ArrayList<String> shiftRight(String myString, int shift){ 

     ArrayList<String> myList = new ArrayList<>(); 

     //Put every character inside the myList 
     for(int i = 0; i < myString.length(); i++){ 
      myList.add(myString.charAt(i) + ""); 
     } 

     ArrayList<String> temp = new ArrayList<>(); 

     //Add the rightmost characters into the temp 
     //Delete those characters from the myList 
     int count = shift; 
     while(count != 0){ 
      temp.add(myList.get(myList.size() - shift)); 
      myList.remove(myList.get(myList.size() - shift)); 
      count--; 
     } 

     //Add the characters from the temp to the beginning of the myList 
     for(int i = 0; i < temp.size(); i++){ 
      myList.add(i ,temp.get(i)); 
     } 


     return myList; 
    } 
} 
+0

@SotiriosDelimanolis, сделано. Взгляните на описание. –

+0

Должен ли вы вернуть массив строк из метода? Можете ли вы вернуть сдвинутую строку? – andrewdleach

+0

Я должен вернуть «сдвинутую строку» внутри «arraylist» (я сам себя оспаривал :)), @andrewdleach –

ответ

-1

Что вы должны сделать для сдвига, чтобы просто добавить одну функцию, которая принимает единственное значение с конца списка , и перемещает вещи на один шаг вправо.

public static <T> void shiftRight(List<T> lst) { 
    if (lst == null || lst.isEmpty()) { 
     return; 
    } 
    T t = lst.get(lst.size() - 1); 
    // list index is zero-based 
    for (int i = lst.size() - 2; i >= 0; i--) { 
     lst.set(i + 1, lst.get(i)); 
    } 
    lst.set(0, t); 
} 

Следовательно, вы делаете shift на 1 элемент справа, и вы используете O (1) дополнительной памяти, чтобы сохранить новый список.

теперь, если вам нужно сдвинуть на 2 элемента - дважды вызовите функцию.

+0

Почему существует 'i + i'. Во-вторых, почему существует 'set (0, t);', @jdevelop. –

+0

@John i + i - это опечатка, и установите (0, t) - вам нужно установить первый элемент списка в значение последнего элемента в списке после того, как вы переместили все элементы по одной позиции на right – jdevelop

+1

Все сдвигается вправо на одно место. Объект справа от массива смещается в начало массива. Поэтому множество (0, t); называется - для размещения последнего индекса спереди. – Catch44

-1

Необязательно использовать класс List для этих простых строковых операций. это может быть сделано с помощью подстроки:

private static String shift(String input, int count){ 
    if(count >= input.length()) 
     throw new IllegalArgumentException("count should be smaller than input.length"); 

    int start = input.length()-count; 
    String part1 = input.substring(start); 
    return part1 + input.substring(0, start); 
} 

public static void main(String[] args){ 
    System.out.println(shift("abcdef", 2)); 
    System.out.println(shift("abcdef", 4)); 
} 

Выхода:

efabcd 
cdefab 
+0

Спасибо и извините, но я уже знаю, как это сделать, используя String. Я также хотел бы сделать эту проблему, используя Arraylists! @ChrisKo –

+0

хорошо, если вам просто любопытно, что это нормально, но я бы никогда не принял такое накладное решение для реального приложения. ;) – ChrisKo

+0

Вау, я получил 4 Downvotes абсолютно без причины. Спасибо за вашу справедливость, ребята. – ChrisKo

-1

Вместо мутирует список, эта проблема будет легче решить, используя массив. ArrayList имеет массив в качестве хранилища резервных копий, но он запутывает проблему под рукой, которая манипулирует индексами char.

Попробуйте вместо этого:

public static String shiftRight(final String theString, final int theShift){ 

    char[] string = theString.toCharArray(); 
    char[] temp = string.clone(); 

    int indexRun = 0; 
    for (int i = theShift; i < string.length; i++) { 
     temp[i] = string[indexRun]; 
     indexRun++; 
    } 

    for (int i = 0; i < theShift; i++) { 
     temp[i] = string[indexRun]; 
     indexRun++; 
    } 

    return new String(temp); 
} 
-1

Вместо myList.size() - shift сделать myList.size() - 1. Ты хочешь захватить последний шар. То же самое с удалением. И при составлении символов, вы хотите сделать myList.add(0, temp.get(i), чтобы он всегда добавлял символы в начало списка. В противном случае ваш код кажется функциональным

0

Как сказано в ответе jdevelop, лучший способ сделать это - реализовать простой метод, который работает с ArrayList.

Поскольку я не могу добавить картинку к своим комментариям, просто не предоставив ссылку, я отправлю этот ответ в поддержку его.

enter image description here

На первом этапе своего кода, копия последнего элемента (розовый овальный) копируется позже. Все элементы смещены вправо.

Затем розовый элемент повторно вводится с использованием метода set (int index, T t) в списках.

метод вы бы включить, чтобы сделать это несколько раз, будет выглядеть следующим образом, включая его исходный код:

void shiftArrayXTimes(List<T> l,int x){ 
    while(int i = 0; i < x; i++){ 
     shiftRight(l); 
} 
} 

В ArrayList, это не сильно отличается. Также обычно предпочтительнее использовать List over an ArrayList, хотя это субъективно.

+0

Если вы подтвердите свой ответ, пожалуйста, подтвердите ответ jdevelop, поскольку его ответ правильный. Я просто объясняю базовую концепцию визуально. – Catch44

+0

Хе-хе, у меня там даже какой-то понижающийся);) – jdevelop