Найдите позиции, в которых расположенные в них элементы имеют наименьшее расстояние между собой

Я пытаюсь добиться положения, в котором элементы, расположенные в них, имеют наименьшее расстояние между собой? у меня есть этот код в java 11:

public class Main {
    public static void main(String[] args) {
        int [] arr= {5, 50, 3, 42, 18, 16, 8, 30, 44};      // Array
        menorD l = new menorD();        
        menorD.MinD(arr);   
    }
}

public class  menorD {

    static int arr_zise;

    public static void minD (int [] arr) {
        arr_zise = arr.length;
        int i, j;
        int minD=0;

        for(i=0;i<arr_zise; i++) {
            for(j=0;j<arr_zise; j++) {
                if (arr[i]!=arr[j]) {
                    minD=arr[i]-arr[j];
                    System.out.print(" i = "+ arr[i]+ " j = "+ arr[j]+ " minD es: "+Math.abs(min));
                    System.out.println();
                }
            }
        }
    }
}

я пытаюсь найти это:

arr = {5, 50, 3, 42, 18, 16, 8, 30, 44}

мой Dmin будет разницей между числами с меньшим расстоянием между ними, в этом случае

Dmin1 = 5-3 = 2;

Dmin2 = 18-16 = 2;

Dmin3 44-42 = 2;

Без повторения индекса числа в массиве. Я сделал этот код, но мне трудно найти то, что я ищу.

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

Tim Biegeleisen 19.05.2019 03:18

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

Philip Wrage 19.05.2019 04:12

Да братан! @PhilipWrage

revilo zednem 19.05.2019 04:51
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
3
253
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Я нашел это в Интернете. Вы делаете это упражнение?

Ссылка: https://www.geeksforgeeks.org/find-the-minimum-distance-between-two-numbers/

public class MinimumDistance {
    int minDist(int arr[], int n, int x, int y)  
    { 
        int i, j; 
        int min_dist = Integer.MAX_VALUE; 
        for (i = 0; i < n; i++)  
        { 
            for (j = i + 1; j < n; j++)  
            { 
                if ((x == arr[i] && y == arr[j] 
                    || y == arr[i] && x == arr[j]) 
                    && min_dist > Math.abs(i - j))  
                    min_dist = Math.abs(i - j); 
            } 
        } 
        return min_dist; 
    } 

    public static void main(String[] args)  
    { 
        MinimumDistance min = new MinimumDistance(); 
        int arr[] = {3, 5, 4, 2, 6, 5, 6, 6, 5, 4, 8, 3}; 
        int n = arr.length; 
        int x = 3; 
        int y = 6; 

        System.out.println("Minimum distance between " + x + " and " + y  
                + " is " + min.minDist(arr, n, x, y)); 
    } 
}

Это выглядит много. Но мне не нужно указывать какое-либо значение x или y. Во всяком случае, я попробую с этим эталонным кодом. @Винг Куй Цой

revilo zednem 19.05.2019 06:53

Ваши Dmin1, Dmin2, Dmin3 не имеют смысла, потому что сложно найти разницу двух элементов массива?

Wing Kui Tsoi 19.05.2019 08:05

При повторении циклов for вы можете заполнить Map из Integer расстояний до List индексов Map<Integer,List<Integer>> (или даже фактических значений в зависимости от вашего варианта использования). Если вы всегда добавляете оба индекса к List вместе, то вы знаете, что они всегда находятся рядом друг с другом в List для последующего поиска в виде пар. Затем просто используйте минимальное расстояние в качестве ключа к карте, чтобы получить список соседних пар. Имейте в виду, что, как описано, этот список будет иметь дубликаты.

Ответ принят как подходящий

В идеале при обработке данных, которые логически сгруппированы вместе, вы должны абстрагироваться от класса, чтобы инкапсулировать его. В вашем случае вы хотите отслеживать все возможные комбинации distance. Каждый Combination должен отслеживать:

  1. Индексы значений.
  2. Сами ценности.
  3. Расстояние.
  4. Какой из них низкий, а какой высокий.

Из них 3. и 4. могут быть вычислены из 1. и 2.

    class Combination {
        int indexA, indexB, valueA, valueB;

        public Combination(int[] array, int indexA, int indexB) {
            this.indexA = indexA;
            this.indexB = indexB;
            this.valueA = array[indexA];
            this.valueB = array[indexB];
        }

        public int getDistance() { ... }
        public int getHigh() { ... }
        public int getLow() { ... }
        public int getHighIndex() { ... }
        public int getLowIndex() { ... }
    }

Имея такую ​​структуру данных (класс), вы можете создавать объекты для каждой из возможных комбинаций (конечно, без повторений — обратите внимание, как j начинает переменно в i + 1, чтобы не повторять возможные комбинации):

        List<Combination> combinations = new ArrayList<>();
        for (int i = 0; i < array.length; i++) 
            for (int j = i + 1; j < array.length; j++) 
                combinations.add(new Combination(array, i, j));

Затем, используя это List из Combination, вы можете вычислить минимальное расстояние между ними всеми:

        int min = combinations.stream()
                .mapToInt(Combination::getDistance)
                .min().getAsInt();

И, наконец, вы можете выбрать те комбинации, которые соответствуют ранее рассчитанному минимальному расстоянию:

        combinations.stream()
            .filter(c -> c.getDistance() == min)
            .forEach(c -> System.out.println(c));

Ключевым моментом является абстрагирование класса Combination в его собственном инкапсулированном классе, поэтому он может нести исключительную ответственность за предоставление необходимых API для проверки конкретной комбинации: индексы, значения, расстояния, высокое значение, низкое значение и даже представления String (toString). .

Ниже приведена полная рабочая демонстрация этого подхода, запустите ее, чтобы почувствовать ее:

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

public class MinimumDistance {

    public static void main(String[] args) {
        printMinimums(5, 50, 3, 42, 18, 16, 8, 30, 44);
    }

    public static void printMinimums(int... array) {
        List<Combination> combinations = new ArrayList<>();
        for (int i = 0; i < array.length; i++) 
            for (int j = i + 1; j < array.length; j++) 
                combinations.add(new Combination(array, i, j));

        int min = combinations.stream()
                .mapToInt(Combination::getDistance)
                .min().getAsInt();

        combinations.stream()
            .filter(c -> c.getDistance() == min)
            .forEach(c -> System.out.println(c));
    }

    static class Combination {
        int indexA, indexB, valueA, valueB;

        public Combination(int[] array, int indexA, int indexB) {
            this.indexA = indexA;
            this.indexB = indexB;
            this.valueA = array[indexA];
            this.valueB = array[indexB];
        }

        public int getDistance() {
            return getHigh() - getLow();
        }

        public boolean isValueAHigh() {
            return valueA > valueB;
        }

        public int getHigh() {
            return isValueAHigh() ? valueA : valueB; 
        }

        public int getLow() {
            return isValueAHigh() ? valueB : valueA; 
        }

        public int getHighIndex() {
            return isValueAHigh() ? indexA : indexB; 
        }

        public int getLowIndex() {
            return isValueAHigh() ? indexB : indexA; 
        }

        public String toString() {
            return String.format("%d[%d] - %d[%d] = %d", 
                                    getHigh(), getHighIndex(), 
                                    getLow(), getLowIndex(), 
                                    getDistance());
        }
    }
}

Полный код на GitHub

Надеюсь это поможет.

Другие вопросы по теме