Я пытаюсь добиться положения, в котором элементы, расположенные в них, имеют наименьшее расстояние между собой? у меня есть этот код в 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;
Без повторения индекса числа в массиве. Я сделал этот код, но мне трудно найти то, что я ищу.
Пожалуйста, уточните свой вопрос. Вы пытаетесь найти не только минимальное расстояние между любыми двумя значениями, но и индексы тех значений, которые соответствуют минимальному расстоянию?
Да братан! @PhilipWrage
Я нашел это в Интернете. Вы делаете это упражнение?
Ссылка: 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. Во всяком случае, я попробую с этим эталонным кодом. @Винг Куй Цой
Ваши Dmin1, Dmin2, Dmin3 не имеют смысла, потому что сложно найти разницу двух элементов массива?
При повторении циклов for вы можете заполнить Map
из Integer
расстояний до List
индексов Map<Integer,List<Integer>>
(или даже фактических значений в зависимости от вашего варианта использования). Если вы всегда добавляете оба индекса к List
вместе, то вы знаете, что они всегда находятся рядом друг с другом в List
для последующего поиска в виде пар. Затем просто используйте минимальное расстояние в качестве ключа к карте, чтобы получить список соседних пар. Имейте в виду, что, как описано, этот список будет иметь дубликаты.
В идеале при обработке данных, которые логически сгруппированы вместе, вы должны абстрагироваться от класса, чтобы инкапсулировать его. В вашем случае вы хотите отслеживать все возможные комбинации distance
. Каждый Combination
должен отслеживать:
Из них 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());
}
}
}
Надеюсь это поможет.
На самом деле я не вижу постановки задачи, объясняющей, чего вы пытаетесь достичь. Возможно, вы захотите добавить это к своему вопросу для достижения наилучших результатов здесь.