Получить следующий элемент в списке, которого нет в другом списке в Java - PullRequest
1 голос
/ 08 марта 2020

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

В основном я хочу получить следующее:

String[] list = new String[]{"apple", "banana", "cherry", "donut", "egg", "fish", "grape"};
List<String> list2 = new ArrayList<String>( Arrays.asList("apple", "cherry", "donut", "fish"));
int index = 4;
System.out.println(nextItem());
System.out.println(nextItem());
System.out.println(nextItem());
System.out.println(nextItem());
System.out.println(nextItem());
//Returns:
//egg
//grape
//banana
//egg
//grape

Я пытался сделать это:

public String nextItem() {
    index++;
    if(index == list.size()) index = 0;
    while(list2.contains(list[index])) {
        index++;
        if(index == list.size()) index = 0;
    }
    return list[index];
}

, но это не работает, индекс просто остается прежним.

Есть ли лучший способ сделать это / что-то похожее на это, о котором я не знаю?

Ответы [ 3 ]

0 голосов
/ 08 марта 2020

Зависит от того, где объявлены список и список2 . Я бы предложил предоставить String Array (list) и List List (list2) в качестве аргументов для метода nextItem () , а также значение начального индекса в качестве третьего аргумента, например:

public static int nextItem(String[] stringArray, List<String> listInterface, int startIndex) {
    int index = -1;
    for (int i = startIndex; i < stringArray.length; i++) {
        if (!listInterface.contains(stringArray[i])) {
            return i;
        } 
    }
    return -1;
}

Приведенный выше пример метода nextItem () возвращает целочисленное значение, которое будет значением индекса, при котором элемент в массиве строк (список) также не содержится в коллекции интерфейса интерфейса (list2) ). Ваш естественный первый вызов этого метода предоставит 0 в качестве аргумента для параметра startIndex . Чтобы получить следующий элемент , а не , общий для обоих списков и list2 , необходимо указать вернул значение индекса из предыдущего nextItem () , добавьте 1 и предоставьте его как startIndex к следующему nextItem () вызов метода. Вот пример:

String[] list = {"apple", "banana", "cherry", "donut", "egg", "fish", "grape"};
List<String> list2 = new ArrayList<>( Arrays.asList("apple", "cherry", "donut", "fish"));

int idx = 0;
while (idx != -1) {
    idx = nextItem(list, list2, idx);
    if (idx != -1) {
        System.out.println(list[idx]);
        idx++;
    } 
}

В окне консоли будет отображаться:

banana
egg
grape  

В следующем примере кода не используется al oop, и он приведен здесь, чтобы быть, возможно, более наглядным помощь тому, что делает код:

String[] list = {"apple", "banana", "cherry", "donut", "egg", "fish", "grape"};
List<String> list2 = new ArrayList<>( Arrays.asList("apple", "cherry", "donut", "fish"));

String noMore = "** There are no more non-shared items in the lists! **";

// Get first non-shared item
int idx = nextItem(list, list2, 0);
if (idx > -1) {
    System.out.println(list[idx]);
}
else {
    System.out.println("Both lists contain all the same items");
    // return from method or event
}

// Get second non-shared item
idx = nextItem(list, list2, idx + 1);
if (idx > -1) {
    System.out.println(list[idx]);
}
else {
    System.out.println(noMore);
    // return from method or event
}

// Get third non-shared item
idx = nextItem(list, list2, idx + 1);
if (idx > -1) {
    System.out.println(list[idx]);
}
else {
    System.out.println(noMore);
    // return from method or event
}

// Get fourth non-shared item (if any)
idx = nextItem(list, list2, idx + 1);
if (idx > -1) {
    System.out.println(list[idx]);
}
else {
    System.out.println(noMore);
    // return from method or event
}

В окне консоли будет отображаться:

banana
egg
grape
** There are no more non-shared items in the lists! **
0 голосов
/ 08 марта 2020

Ключ в том, чтобы продолжать увеличивать index, пока элемент из list не будет найден в list2. Я сделал это, используя while l oop в приведенной ниже программе:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Main {
    static String[] list = new String[] { "apple", "banana", "cherry", "donut", "egg", "fish", "grape" };
    static List<String> list2 = new ArrayList<String>(Arrays.asList("apple", "cherry", "donut", "fish"));
    static int index = 4;

    public static void main(String[] args) {
        System.out.println(nextItem());
        System.out.println(nextItem());
        System.out.println(nextItem());
        System.out.println(nextItem());
        System.out.println(nextItem());
    }

    static String nextItem() {
        if (index == list.length) {
            index = 0;
        }
        while (list2.contains(list[index])) {
            index++;
        }
        return list[index == list.length ? 0 : index++];
    }
}

Вывод:

egg
grape
banana
egg
grape

Не стесняйтесь комментировать в случай любой проблемы / сомнения.

0 голосов
/ 08 марта 2020

Несколько изменений, и это работает как шарм:

public class Example {
    String[] list = new String[]{"apple", "banana", "cherry", "donut", "egg", "fish", "grape"};
    List<String> list2 = new ArrayList<>(Arrays.asList("apple", "cherry", "donut", "fish"));
    public int index = 4;

    public static void main(String[] args) {
        new Example().start();
    }

    public void start() {
        for (int i = 0; i < 100000; i++) {
            System.out.println(nextItem());
        }
    }

    public String nextItem() {
        index++;
        if (index == list.length) index = 0;
        while (list2.contains(list[index])) {
            index++;
            if (index == list.length) index = 0;
        }
        return list[index];
    }
}

Главное, что index должно быть глобальным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...