tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
4
ZUGRIFFE
421
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Registriert seit
    May 2001
    Ort
    Konstanz
    Beiträge
    542
    Ich möchte den Wert finden der ab besten zu dem gesuchten Wert passt.
    Und natürlich wenn möglich nicht mit einer naiven linearen Suche.

    Angenommen ich hab folgenden <Float,Object> Baum
    10.3f,x
    15.5f,y
    20.5f,z

    Dann soll mir die Suche nach 11.0 x liefern
    und die Suche nach 14 y

    Geht sowas?
    Kann mich erinnern dass es in der STL unter C++ sowas gab... aber hab nich so den plan von Java.
    Danke in voraus.
    Geändert von Sovok (28.03.09 um 15:03 Uhr)
     

  2. #2
    Avatar von Klein0r
    Klein0r Klein0r ist offline Mitglied Platin
    Registriert seit
    Sep 2007
    Ort
    Paderborn
    Beiträge
    718
    Liegen die Daten denn sortiert vor?
     
    - Ich fotografiere mit Nikon -
    Mehr zur Ausrüstung in meinem Profil

    :: klein0r.de :: kleine-photo.com :: flickr ::

  3. #3
    Registriert seit
    May 2001
    Ort
    Konstanz
    Beiträge
    542
    Ja die Daten sind sortiert.
    Ich denk die beste möglichkeit ist mit arrays + binarySearch zu arbeiten und dann den Rückgabewert zu verwenden falls kein exakter match gefunden wird.
     

  4. #4
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.885
    Blog-Einträge
    29
    Hallo,

    schau doch mal hier:
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    
    package de.tutorials;
     
    import java.util.Arrays;
    import java.util.Comparator;
     
    public class FindNearestElementExample {
     
        /**
         * @param args
         */
        public static void main(String[] args) {
            Double[] values = { 20.0, 12.1, 123.321, 123.001, 123.002, 295.3, 12.4, 100.0 };
            Arrays.sort(values);
            System.out.println(Arrays.toString(values));
     
            int index = findIn(values, 123.321);
            System.out.println(index + " " + values[index]);
     
            index = findIn(values, 12.3, 0.1);
            System.out.println(index + " " + values[index]);
     
            index = findIn(values, 123.0, 0.0011);
            System.out.println(index + " " + values[index]);
            
            index = findIn(values, 21, 1.0);
            System.out.println(index + " " + values[index]);
        }
     
        private static int findIn(Double[] values, double value) {
            return Arrays.binarySearch(values, value);
        }
     
        private static int findIn(Double[] values, double value, double tolerance) {
            return Arrays.binarySearch(values, value, new ToleranceAwareComparator(tolerance));
        }
        
        static class ToleranceAwareComparator implements Comparator<Double> {
            double tolerance;
     
            public ToleranceAwareComparator(double tolerance) {
                this.tolerance = tolerance;
            }
            
            public int compare(Double o1, Double o2) {
                double delta = o1 - o2;
                if(Math.abs(delta) <= tolerance){
                    return 0;
                }
                return (int)Math.signum(delta);
            }
        };
    }

    Ausgabe:
    Code :
    1
    2
    3
    4
    5
    
    [12.1, 12.4, 20.0, 100.0, 123.001, 123.002, 123.321, 295.3]
    6 123.321
    1 12.4
    4 123.001
    2 20.0

    Gruß Tom
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  5. #5
    Avatar von takidoso
    takidoso takidoso ist offline Mitglied Brillant
    Registriert seit
    Aug 2004
    Ort
    Kömigstein
    Beiträge
    911
    Hi Tom,
    DieIdee mit der Toleranz ist ein echt interessanter Ansatz....

    Aber mal eine Frage, was macht Dein Programm wenn es keine Zahl in der gewünschten Toleranz findet, oder das erste Element in der toleranz ist aber ein zweites noch besser passt weil Unterschied kleiner?

    Müsste man nicht eigentlich drei Werte miteinander vergleichen (tatsächlicher Wert, höherer Wert und niedriger Wert) und den nehmen, der tatsächlich den kleinsten Unterschied bedeutet?
    Geändert von takidoso (31.03.09 um 14:14 Uhr)
     

Ähnliche Themen

  1. » Excel Excel 2010 Wert in einer Zelle anhand mehrerer Kriterien finden
    Von Thomas Darimont im Forum Office-Anwendungen
    Antworten: 0
    Letzter Beitrag: 30.12.10, 19:10
  2. Antworten: 3
    Letzter Beitrag: 15.10.10, 08:18
  3. Zählen wie oft ein Wert von 3 in einer Spalte zu finden ist
    Von PostmanX im Forum Relationale Datenbanksysteme
    Antworten: 8
    Letzter Beitrag: 12.02.09, 20:49
  4. Antworten: 3
    Letzter Beitrag: 03.10.08, 15:52
  5. Naheliegenster Wert finden in Array
    Von MariusMeier im Forum Algorithmen & Datenstrukturen mit Java
    Antworten: 5
    Letzter Beitrag: 09.04.08, 23:57