私はこれらに位置要素は、それらの間の最小距離を持っているポジションを達成しようとしますか?私は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;
配列の数の指標を繰り返すことなく。私はこのコードを作ったが、私は難し私が探しています何を見つけることがあります。
論理的にグループ化されたデータを処理する際に理想的に、あなたは抽象離れクラスは、それをカプセル化する必要があります。あなたのケースでは、あらゆる可能なの軌道維持したいdistance
組み合わせを。それぞれCombination
を追跡する必要があります。
- 値のインデックス。
- 値そのもの。
- 距離。
- どちらが低く、1はハイです。
これらの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());
}
}
}
お役に立てれば。