2012-11-10 11 views
16

ich eine Reihe von positiven/negativen Ints habeam nächsten Wert auf eine Zahl in dem Feld erhält

int[] numbers = new int[10]; 
numbers[0] = 100; 
numbers[1] = -34200; 
numbers[2] = 3040; 
numbers[3] = 400433; 
numbers[4] = 500; 
numbers[5] = -100; 
numbers[6] = -200; 
numbers[7] = 532; 
numbers[8] = 6584; 
numbers[9] = -945; 

Nun würde Ich mag eine andere int gegen diese Anordnung zu testen, und gibt die Nummer, die am nächsten an den int .

Zum Beispiel, wenn ich die Nummer 490 verwenden würde, würde ich Artikel # 4 von den Nummern 500 zurückbekommen, was ist der beste Weg, so etwas zu tun?

int myNumber = 490; 
int distance = 0; 
int idx = 0; 
for(int c = 0; c < numbers.length; c++){ 
    int cdistance = numbers[c] - myNumber; 
    if(cdistance < distance){ 
     idx = c; 
     distance = cdistance; 
    } 
} 
int theNumber = numbers[idx]; 

Das funktioniert nicht. Irgendwelche Vorschläge für eine gute Methode, dies zu tun?

+1

'cdistance = Zahlen [c] - myNumber'. Du nimmst nicht den absoluten Wert. – irrelephant

+3

Sie müssen mit "distance" gleich einer sehr großen Zahl beginnen. Ansonsten wird 'cdistance' nie kleiner sein als es. Außerdem müssen Sie vor dem Vergleich den absoluten Wert von 'cdistance' nehmen. –

Antwort

31
int myNumber = 490; 
int distance = Math.abs(numbers[0] - myNumber); 
int idx = 0; 
for(int c = 1; c < numbers.length; c++){ 
    int cdistance = Math.abs(numbers[c] - myNumber); 
    if(cdistance < distance){ 
     idx = c; 
     distance = cdistance; 
    } 
} 
int theNumber = numbers[idx]; 

initialisieren immer Ihre Min-/Max-Funktionen mit dem ersten Element Sie in Betracht ziehen. Die Verwendung von Dingen wie Integer.MAX_VALUE oder Integer.MIN_VALUE ist eine naive Art, Ihre Antwort zu erhalten; es hält nicht gut, wenn Sie Datentypen später ändern (hoppla, MAX_LONG und MAX_INT sind sehr unterschiedlich!) oder wenn Sie in der Zukunft, eine generische min/max Methode für jeden Datentyp schreiben mögen.

+0

Danke für die nette Logik. – Siddharth

+0

-1 Für den "naiven" Kommentar. Sie erhalten garantiert die richtige Antwort mit der geringsten Menge an Code. Die Szenarien, die Sie beschreiben, sind im Grunde Goldplating. – NullUserException

4

Sie sind sehr nah dran. Ich denke, der Anfangswert von 'distance' sollte eine große Zahl anstelle von 0 sein. Und verwende den absoluten Wert für die cdistance.

2

cdistance = numbers[c] - myNumber. Du nimmst nicht den absoluten Wert der Differenz. Wenn myNumber viel größer ist als numbers[c] oder wenn numbers[c] negativ ist, wird der Vergleich als "minimale Differenz" registriert.

Nehmen Sie zum Beispiel den Fall, wo numbers[c] = -34200. numbers[c] - myNumber wäre dann -34690, viel weniger als die distance.

Außerdem sollten Sie distance auf einen großen Wert initialisieren, da zu Beginn keine Lösung gefunden wurde.

-4

Dies ist etwas, das ich getan habe ...

import javax.swing.JOptionPane; 

public class NearestNumber { 

public static void main(String[] arg) 
{ 
    int[] array={100,-3420,3040,400433,500,-100,-200,532,6584,-945}; 

    String myNumberString =JOptionPane.showInputDialog(null,"Enter the number to test:"); 
    int myNumber = Integer.parseInt(myNumberString); 

    int nearestNumber = findNearestNumber(array,myNumber); 

    JOptionPane.showMessageDialog(null,"The nearest number is "+nearestNumber); 
} 

public static int findNearestNumber(int[] array,int myNumber) 
{ 

    int min=0,max=0,nearestNumber; 

    for(int i=0;i<array.length;i++) 
    { 
     if(array[i]<myNumber) 
     { 
      if(min==0) 
      { 
       min=array[i]; 
      } 
      else if(array[i]>min) 
      { 
       min=array[i]; 
      } 
     } 
     else if(array[i]>myNumber) 
     { 
      if(max==0) 
      { 
       max=array[i]; 
      } 
      else if(array[i]<max) 
      { 
       max=array[i]; 
      } 
     } 
     else 
     { 
      return array[i]; 
     } 
    } 

    if(Math.abs(myNumber-min)<Math.abs(myNumber-max)) 
    { 
     nearestNumber=min; 
    } 
    else 
    { 
     nearestNumber=max; 
    } 

    return nearestNumber; 
} 

}

0

ich das für meinen Kurs als Zuweisung tat, und ich programmierte es in Ready to Programm Java, so traurig, wenn es eine etwas verwirrend.

// The "Ass_1_B_3" class. 
import java.awt.*; 
import hsa.Console; 

public class Ass_1_B_3 
{ 
    static Console c;   // The output console 

    public static void main (String[] args) 
    { 
     c = new Console(); 

     int [] data = {3, 1, 5, 7, 4, 12, -3, 8, -2}; 
     int nearZero = 0; 
     int temp = 0; 
     int temp2 = data[0]; 

     for (int i = 0; i < data.length; i++) 
     { 
      temp = Math.abs (data[i]); 
      nearZero = temp2; 
      if (temp < temp2) 
      { 
       temp2 = temp; 
       nearZero = data[i]; 
      } 


     } 

     c.println ("The number closest to zero is: " + nearZero); 

     // Place your program here. 'c' is the output console 
    } // main method 
} // Ass_1_B_3 class 
-1
public int nearnum(int myNumber,int[] numbers) 
    { 
     int distance = Math.abs(numbers[0] - myNumber); 
     int idx = 0; 
     for(int c = 1; c < numbers.length; c++){ 
      int cdistance = Math.abs(numbers[c] - myNumber); 
      if(cdistance < distance){ 
       idx = c; 
       distance = cdistance; 
      } 
     } 
     return numbers[idx]; 
    } 
+0

Willkommen bei Stack Overflow! Könnten Sie bitte etwas Text hinzufügen, der die Antwort erklärt? Code-Snippets allein sind nicht genug als Antwort auf dieser Website. – mech

+0

Können Sie erklären, wie sich das von Chris Hayes 'Antwort unterscheidet? – sziraqui

0

Ein Anweisungsblock zu initialisieren und das nächste Spiel gesetzt. Geben Sie -1 zurück, wenn keine Übereinstimmung gefunden wird (leeres Array).

protected int getClosestIndex(final int[] values, int value) { 
    class Closest { 
     Integer dif; 
     int index = -1; 
    }; 
    Closest closest = new Closest(); 
    for (int i = 0; i < values.length; ++i) { 
     final int dif = Math.abs(value - values[i]); 
     if (closest.dif == null || dif < closest.dif) { 
      closest.index = i; 
      closest.dif = dif; 
     } 
    } 
    return closest.index; 
} 
+0

Warum würden Sie eine verschachtelte Klasse verwenden, ich bin nur neugierig! – Sikorski

0
public int getClosestToTarget(int target, int[] values) { 

    if (values.length < 1) 
     throw new IllegalArgumentException("The values should be at least one element"); 
    if (values.length == 1) { 
     return values[0]; 
    } 
    int closestValue = values[0]; 
    int leastDistance = Math.abs(values[0] - target); 
    for (int i = 0; i < values.length; i++) { 
     int currentDistance = Math.abs(values[i] - target); 
     if (currentDistance < leastDistance) { 
      closestValue = values[i]; 
      leastDistance = currentDistance; 
     } 
    } 
    return closestValue; 
} 
3

Mit Java 8 Stream-API:

List<Integer> list = Arrays.stream(numbers).boxed().collect(Collectors.toList()); 
int n = 490; 
int closestToN = list.stream().min(Comparator.comparingInt(i -> Math.abs(i - n))).get(); 

Ursprünglich, könnten Sie eine Liste anstelle von Array verwenden möchten, so können Sie zusätzliche Flexibilität bei Operationen erhalten damit Elemente ist.

-1
public class Main  
{ 
    public static void main(String[] args) 
    { 
     int[] numbers = {6,5,10,1,3,4,2,14,11,12}; 

     for(int i =0; i<numbers.length; i++) 
     { 
      sum(numbers, i, numbers[i], 12, String.valueOf(numbers[i])); 
     } 
    } 

    static void sum(int[] arr, int i, int sum, int target, String s) 
    { 

     int flag = 0; 

     for(int j = i+1; j<arr.length; j++) 
     { 

      if(arr[i] == target && flag==0) 
      { 
       System.out.println(String.valueOf(arr[i])); 
       flag =1; 

      } 
      else if(sum+arr[j] == target) 
      { 
       System.out.println(s+" "+String.valueOf(arr[j])); 

      } 
      else 
      { 
       sum(arr, j, sum+arr[j], target, s+" "+String.valueOf(arr[j])); 
      } 
     }   
    } 
} 
+0

Array erhalten und den Zielwert in Java berechnen – Rivean

Verwandte Themen