как сравнить порядок двух списков, когда один список не стабилен - PullRequest
0 голосов
/ 24 августа 2018

У меня есть несколько строковых объектов, которые я храню в Списке, например

: [США, CN, IN, EN, FR, GR, PL, MX]

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

но суть в том, что список, который я использую для сравнения, иногда не имеет ни одного из вышеуказанных кодов стран ...

например, список, с которым я сравниваю, это [US, CN, EN, GR, PL, MX]

, но он должен пройти и вернуть true, потому что он в том же порядке, что и первый список.

, если список похож на [CN, US, EN, GR, PL, MX] он должен потерпеть неудачу, потому что CN пришел раньше США.

не имеет значения, есть ли в списке все значения или нет, даже если мы пропустим какой-либо код страны, он должен пройти, если порядок кода другой страны правильный

Пожалуйста, дайте мнеИдея о том, что лучший способ сделать?

Ответы [ 3 ]

0 голосов
/ 24 августа 2018

Вы можете удалить все элементы из списка для проверки, а затем сравнить два списка:

public static boolean check(String checkedAgainst, String items) {
    List<String> checkedAgainstList = new ArrayList<>(Arrays.asList(checkedAgainst.split("\\s*,\\s*")));
    List<String> list = Arrays.asList(items.split("\\s*,\\s*"));
    checkedAgainstList.retainAll(list);
    return checkedAgainstList.equals(list);
}

Тест:

boolean valid = check("US, CN , IN, EN, FR, GR, PL, MX", "US, CN, EN, GR,PL, MX"); // true
0 голосов
/ 24 августа 2018

Вот еще одно решение с TestNg Assert:

List<String> baseList = Arrays.asList("US", "CN" , "IN", "EN", "FR", "GR", "PL", "MX");
List<String> newList = Arrays.asList("US", "CN" , "EN", "GR", "PL", "MX");

int index = baseList.indexOf(newList.get(0));
for (int i = 1; i < newList.size(); i++) {
    int nextElementIndex = baseList.indexOf(newList.get(i));
    Assert.assertTrue(nextElementIndex > index, "List order correct");
    index = nextElementIndex;
}
0 голосов
/ 24 августа 2018

Мы можем сопоставить каждый проверяемый элемент списков с соответствующим (indexOf) индексом в (первом) списке «order», а затем проверить, что каждый такой индекс больше или равен индексу, предшествующему ему.

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

Списки:

List<String> order = Arrays.stream("US, CN , IN, EN, FR, GR, PL, MX".split(","))
        .map(String::trim)
        .collect(Collectors.toList());
List<String> list1 = Arrays.stream("US, CN, EN, GR,PL, MX".split(","))
        .map(String::trim)
        .collect(Collectors.toList());
List<String> list2 = Arrays.stream("CN, US, EN, GR, PL, MX".split(","))
        .map(String::trim)
        .collect(Collectors.toList());

Проверка заказа:

//range(1, list1.size()) assumes list1's size is at least 2.
boolean list1Ordered = IntStream.range(1, list1.size())
        .allMatch(i -> order.indexOf(list1.get(i)) 
                >= order.indexOf(list1.get(i - 1))); //returns true
boolean list2Ordered = IntStream.range(1, list2.size())
        .allMatch(i -> order.indexOf(list2.get(i)) 
                >= order.indexOf(list2.get(i - 1))); //returns false

Обратите внимание, что в приведенном выше примере рассматривается "упорядоченный", когда два последовательных элемента list1 совпадают (измените на >, если логика говорит об обратном).

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