Java сравнить два списка String одинакового размера, где важен порядок - PullRequest
0 голосов
/ 26 мая 2020

Я сейчас застрял при сравнении двух списков строк. Вот входные данные:

First list : three, two, ten, five.
Second list: three, ten, two, five.

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

Для большей ясности я приложил снимок экрана.

enter image description here

Вот мой код

public static void main(String[] args) {

 List<String> list1 = new ArrayList<String>();
 List<String> list2 = new ArrayList<String>();


    list1.add("three");
    list1.add("two");
    list1.add("ten");
    list1.add("five");

    list2.add("three");
    list2.add("ten");
    list2.add("two");
    list2.add("five");

    for(int iIndex = 0, jIndex = 0; iIndex < list1.size() && jIndex < list2.size(); iIndex ++, jIndex++) {
        if(!list1.get(iIndex).contentEquals(list2.get(jIndex))) {
            list1.add(jIndex, "");
        }
    }

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

Ответы [ 3 ]

0 голосов
/ 26 мая 2020

Проблема, как я вижу, в том, что нет способа определить, какой список следует вставить с пустой строкой. Я бы вставил по одному в оба. Это предполагает, что оба списка имеют одинаковую длину для начала. При изменении размера списка в al oop я предпочитаю делать это в обратном порядке, чтобы все индексы оставались синхронизированными c.

for (int i = list1.size()-1; i >= 0; i--) {
    if (list1.get(i) != list2.get(i)) {
        list1.add(i,"");
        list2.add(i+1,"");
    }
}

for (int i = 0; i < list1.size(); i++) {
    System.out.printf("%7s  %7s%n",list1.get(i),list2.get(i));
}

Печать

  three    three
             ten
    two         
             two
    ten         
   five     five

или могло быть так.

 three    three
    two         
             ten
    ten         
             two
   five     five
0 голосов
/ 26 мая 2020

На скриншоте видно, что если элементы не равны, то элементы нужно сравнивать со следующим элементом в списке. Однако нужно сделать еще одно предположение. Это предположение, какой элемент выбрать, если они одинаковы.

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

//Assuming list1.size() == list2.size() from the start
int listSize = list1.size();

for(int i=0; i<listSize; i++){
    // If both are equal
    if(list1.get(i).equals(list2.get(i))){
        continue;
    }
    // If lists have the same size, pick value of list1
    if(list1.size() == list2.size()){
        System.out.println("Putting empty in list2");
        list2.add(i,"");
        listSize+=1;
    }
    else{
        System.out.println("Putting empty in list1");
        list1.add(i,"");
    }
}

Вывод:

Putting empty in list2
Putting empty in list1

three three
two 
ten   ten
      two
five  five
0 голосов
/ 26 мая 2020

Если я правильно понял ваш вопрос, вам нужно что-то вроде этого

int size = list2.size();
for(int i = 0; i < size ; i++) {
    if(!list1.get(i).contentEquals(list2.get(i))) {
      if(list2.size() <= list1.size()) {
        list2.add(i, "XXX");
        size +=1;
      } else {
        list1.add(i, "XXX");
      } 
    }
}

И результат будет:

three   three
two     XXX
ten     ten
XXX     two
five    five

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

UPDATE:

Вы можете попробовать сделать что-то вроде этого.

int size = list1.size();
for(int i = 0; i < size; i++) {
  if(list1.size() == i){
    list1.add(i, "XXX");
    continue;
  }
  if(list2.size() == i){
    list2.add(i, "XXX");
    continue;
  }
  if(!list1.get(i).contentEquals(list2.get(i))) {
    int next_index1 = list2.subList(i, list2.size()).indexOf(list1.get(i));
    int next_index2 = list1.subList(i, list1.size()).indexOf(list2.get(i));

    if (next_index1 == -1){
      list2.add(i, "XXX");
    }
    else if(next_index2 == -1){
      list1.add(i, "XXX");
    } 
    else if(next_index1 < next_index2) {
      list1.add(i, "XXX");
    } else {
      list2.add(i, "XXX");
    } 
  }
  size = list1.size() < list2.size() ? list2.size() : list1.size();
}
for(int i = 0; i < size ; i++) {
  System.out.println(list1.get(i) + "   " + list2.get(i));
}

Вкратце, он проверит, когда наиболее близко вхождение строки в другом списке. Например, если ваши списки:

three   three
two     ten
ten     two
five    five

После первых элементов в каждом списке, поскольку они одинаковы, он найдет расстояние между текущей позицией в первом списке и индексом первого вхождения этого элемента во втором списке и наоборот. Если расстояния равны, то во втором списке будет добавлено место. Таким образом, результат будет

three   three
two     XXX
ten     ten
XXX     two
five    five

Но если ваш список

three   three
two     ten
five     two

, результат будет

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