обход массива Java по кругу - PullRequest
10 голосов
/ 28 декабря 2011

У меня есть массив, который имеет 1 2 3 4 5 значений.

array a = [ 1 , 2, 3, 4, 5]

Теперь я хочу обойти его по кругу.как я хочу напечатать 2 3 4 5 1 или 3 4 5 1 2 или 5 1 2 3 4 и так далее.любой алгоритм по этому поводу?

Редактировать: Я хочу напечатать всю комбинацию по кругу.я не хочу указывать начальную точку на начальном этапе.

Ответы [ 5 ]

20 голосов
/ 28 декабря 2011
int start = ...
for (int i = 0; i < a.length; i++) {
    System.out.println(a[(start + i) % a.length]);
}

(Если вы хотите перебрать массив в обратном направлении от start, измените start + i на start - i в выражении индекса массива.)

Я должен отметить, что это, вероятно, не самый эффективный способ выражения цикла ... с точки зрения скорости выполнения. Однако разница невелика и скорее всего не имеет значения .

Более важным моментом является то, дает ли использование % таким образом более читаемый код. Я думаю, что это так, но, возможно, это потому, что я видел / использовал эту идиому раньше.

1 голос
/ 08 мая 2018

В дополнение к ответу Stephen C

int start = ...

for (int i = 0; i < a.length; i++) {
    System.out.println(a[(start - i + a.length) % a.length]);
}

Используйте это для обратного цикла от начального индекса. Это немного неясно, но в некоторых случаях очень полезно. Например: компоненты пользовательского интерфейса, такие как карусель.

И нет ArrayIndexOutOfBoundsException !!!

1 голос
/ 28 декабря 2011
int st = n ; // n is the starting position from where you print
for(int i = st; i < a.length; i++)
{
   -- print each array[i];
}

if(st != 0)
{
   for(int i = 0 ; i < st ; i++)
   {
      --- print each array[i];
   }
}
1 голос
/ 28 декабря 2011

По сути, вам просто нужно перебрать массив и при необходимости изменить текущий индекс (например, переместить его в начало массива, когда он встретит конец)

public static void main(String[] args) {
    int[] array = new int[] { 1, 2, 3, 4, 5 };
    System.out.println(printCircularly(array, 4));
}

private static String printCircularly(int[] array, int startIndex) {
    StringBuilder sb = new StringBuilder();
    int currentIndex = startIndex;
    do {
        sb.append(array[currentIndex++]);
        if (currentIndex > array.length - 1) {
            currentIndex = 0;
        }
    }
    while (currentIndex != startIndex);
    return sb.toString();
}
1 голос
/ 28 декабря 2011

Как насчет следующего:

int start = // start position, must be in bounds
int i = start;
do {

   ....

   i++;
   if(i == a.length) i = 0;
} while(i != start);
...