Как сделать условие корректным

196
12 апреля 2022, 03:30

Вопрос: как изменить код, чтобы он корректно работал. Основная проблема в инициализации массива.

Задача: Данные два массива строк a1 и a2 возвращают отсортированный массив r в лексикографическом порядке строк a1, которые являются подстроками строк a2.

Пример 1:

a1 = ["arp", "live", "strong"]
a2 = ["lively", "alive", "harp", "sharp", "armstrong"]

returns ["arp", "live", "strong"]

Пример 2:

a1 = ["tarp", "mice", "bull"]
a2 = ["lively", "alive", "harp", "sharp", "armstrong"]
returns []

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

Код:

public static String[] inArray(String[] array1, String[] array2) {
        for (int i = 0; i < array1.length; i++) {
            for(int c = 0; c < array2.length; c++){
                boolean got = array2[c].contains(array1[i]);
                if (got == true && array3[i] != array1[i]) {
                    String[] array3 = new String[] {array1[i]};
                System.out.println(array3[i]);
              }
            }
        }
            return array3;
    }
Answer 1

В результирующем массиве не будет больше элементов, чем в первом массиве. Поэтому его можно сделать изначально равным ему, а потом, при необходимости, уменьшить

public static String[] inArray(String[] array1, String[] array2) {
  String[] array3 = new String[array1.length];
  int cnt = 0;
  for (int i = 0; i < array1.length; i++) {
    for (int c = 0; c < array2.length; c++) {
      if (array2[c].contains(array1[i]) {
        array3[cnt++] = array1[i];
        break;  // Один раз вхождение нашли, дальше искать нет смысла
      }
    }
  }
  // если записали меньше элементов, чем размер массива
  if (cnt < array3.length) {
    // то создаем массив меньшего размера
    String[] tmp = new String[cnt];
    // и копируем в него элементы
    System.arrayCopy(array3, 0, tmp, 0, cnt);
    array3 = tmp;
  }
  // не забываем отсортировать массив
  Arrays.sort(array3);
  return array3;
}

Чтобы избежать приседаний с уменьшением массива, можно сразу использовать List<String>, а потом дернуть .toArray()

Answer 2

Логика, в принципе, правильная. Только нужно создать array3 (лучше как ArrayList, т.к. точная длина неизвестна) до циклов и в случае совпадения (got == true, а array3[i] != array1[i] выкинуть, это вообще непонятно что такое) добавлять в array3 нужный элемент. Если нужно без повторов, то в нужном месте вставить break.

READ ALSO
Как вывести многомерный массив в консоль?

Как вывести многомерный массив в консоль?

Создал многомерный массив (3x5), теперь надо вывести в консольКак можно это сделать?

219
Как сделать так, чтобы выделенную строку в TableView можно было менять?

Как сделать так, чтобы выделенную строку в TableView можно было менять?

Начал изучать javafx для создания GUIДо этого учил swing В swing можно создать такую таблицу:

209
Сохранить файл в кодировке utf-8 java

Сохранить файл в кодировке utf-8 java

Мне нужно сохранить файл в форматеtsv чтобы у него была кодировка в utf-8, насколько это реально сделать? Делало в том что у меня есть строка в которой...

83