Переход от первого к последнему в массиве, когда последний может быть меньше первого

#java #algorithm #data-structures #deque

Вопрос:

Есть ли лучший способ выполнить переход от первого к последнему в массиве, когда последний может быть меньше первого, в Java? Это то, что я в настоящее время использую в своей реализации deque:

 public void printDeque() {
    int start = nextFirst   1, end = nextLast - 1;
    if (start >= end) {
        for (int i = start; i < list.length; i  ) {
            System.out.print(list[i]   " ");
        }

        for (int i = 0; i <= end; i  ) {
            System.out.print(list[i]   " ");
        }
    } else {
        for (int i = start; i <= end; i  ) {
            System.out.print(list[i]   " ");
        }
    }

    System.out.println();
}
 

Ответ №1:

Я бы посоветовал вам создать ArrayList экземпляр, добавить каждый элемент от nextFirst до nextLast (по модулю размера) и отобразить полученный список :

 import java.util.*;

public class HelloWorld {
    static String[] array = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j"};
    
    public static void deque(int nextFirst, int nextLast) {
        nextFirst %= array.length; // Simple security measure
        nextLast %= array.length; // Simple security measure
        
        int id = nextFirst;
        if (nextLast < nextFirst)
            nextLast  = array.length;
        
        ArrayList<String> list = new ArrayList<>();
        while (id <= nextLast)
            list.add(array[id   % array.length]);
        
        String[] result = list.toArray(new String[list.size()]);
        System.out.println(String.join(" ", result));
    }
    
    public static void main(String... args) {
        deque(7, 2);
    }
}
 

Ответ №2:

Я понял, что во время обхода lastIndex не имеет значения, поскольку объекты размещаются последовательно, поэтому мы можем начать с первой позиции и продолжать, пока не столкнемся с нулем.

Затем мы можем начать с 0 и продолжать до тех пор, пока не получим ноль, оставаясь меньше первой позиции. Этот случай возникает только тогда, когда первый > последний.

Вот код:

 private int getFirstIndex() {
    int first = nextFirst   1;
    if (first == items.length) {
        first = 0;
    }
    return first;
}

public void printDeque() {
    int firstIndex = getFirstIndex()
    for (int i = firstIndex; i < items.length amp;amp; items[i] != null; i  ) {
        System.out.print(items[i]   " ");
    }
    for (int i = 0; i < firstIndex amp;amp; items[i] != null; i  ) {
        System.out.print(items[i]   " ");
    }
    System.out.println();
}