2015-04-17 10 views
5

Ho una classeSelezionare un oggetto sulla base del suo valore minimo di attributo dalla lista in Java

public class LocationDistances { 
    String locs; 
    double distances; 

} 

e un ArrayList composta da LocationDistances oggetti in un'altra classe

ArrayList<LocationDistances> locsDis = new ArrayList(Arrays.asList(
    new LocatoinDistances("abc",23.234556), 
    new LocatoinDistances("xyz",3.3444566), 
    . . . 
    . . . 
    . . . 

)); 

Come selezionare LocationDistances .loc dalla lista matrici sulla base del valore minimo di LocationDistances.distance da locsDis arrayList?

+0

È possibile ignorare 'equals' e metodi' hashcode' della classe 'Object'. Oppure puoi scrivere un comparatore per ordinare la tua lista con la distanza minima in cima in modo da poterla recuperare come primo elemento nella tua lista. –

risposta

4

Qualcosa di simile a questo funzionerebbe se non ci sono distanze duplicati.

LocationDistances min=null; 
for(LocationDistances x:locsDis){ 
    min=(min==null||x.distances<min.distances)?x:min; 
} 
String minimumDistance=min.locs; 

se ci sono distanze duplicati usare qualcosa di simile

ArrayList<LocationDistances> min=new ArrayList<LocationDistances>(); 

for(LocationDistances x:locsDis){ 
    if(min.size()==0||x.distances==min.get(0).distances) 
      min.add(x); 
    else if(x.distances<min.get(0).distances){ 
      min.clear(); 
      min.add(x); 
    }    
} 
6

Se si utilizza Java 8 (Si dovrebbe :)):

locsDis.stream().min((first, second) -> Double.compare(first.distance, second.distance)).get(); 

Edit: ha deciso di fare questo post un po 'più completo per aiutare quelli di noi che sono ancora confinato alla Java < 8 ma può utilizzare la guava biblioteca impressionante :)

Java 6 & 7 Con guava (Google util biblioteca):

Ordering<LocationDistances> ordering = new Ordering<LocationDistances>() { 
    @Override 
    public int compare(LocationDistances left, LocationDistances right) { 
     return Double.compare(left.distance, right.distance); 
    } 
}; 
return ordering.max(list); 
+0

Presume che 'distance()' restituisca un 'Double'. Meglio usare 'Double.compare'. –

+0

Ancora non funziona. 'first.distances' è un' double', non un 'Double'. Non puoi chiamare 'compareTo' su una primitiva. –

+0

ha, vedo il tuo punto ora per la correzione :) il edit. –

0

@David Limkys ha ragione, sarebbe una soluzione in Java 8, per java 6 & 7 il follwing farebbe.

public class MainCLass { 

    /** 
    * 
    */ 
    public MainCLass() { 
     // TODO Auto-generated constructor stub 
    } 

    public static void main(String[] args) { 

     LocationDistances[] arr = new LocationDistances[] { 
       new LocationDistances("abc", 23.234556), 
       new LocationDistances("xyz", 3.3444566), }; 

     ArrayList<LocationDistances> locsDis = new ArrayList(Arrays.asList(arr)); 

     Collections.sort(locsDis, new Comparator<LocationDistances>() { 
      public int compare(LocationDistances o1, LocationDistances o2) { 
       return (int)(o1.distances - o2.distances); 
      } 
     }); 

    } 

} 

class LocationDistances { 
    String locs; 
    double distances; 

    /** 
    * @param locs 
    * @param distances 
    */ 
    public LocationDistances(String locs, double distances) { 
     super(); 
     this.locs = locs; 
     this.distances = distances; 
    } 

    @Override 
    public String toString() { 
     return String.format("LocationDistances [locs=%s, distances=%s]", locs, 
       distances); 
    } 

} 
+0

'return (int) (o1.distances - o2.distances);' non funziona. Si potrebbe finire per arrotondare la differenza a zero quando i due 'doppi 'originali non erano uguali. –

+0

true, in alternativa, potremmo confrontarli e restituire "0,1, -1" ma credo di essere stato pigro :) –

0

È possibile implementare Paragonabile su LocationDistances e ordinare l'ArrayList utilizzando il comparatore per la distanza in ordine crescente.

public class LocationDistances implements Comparable { 
    String locs; 
    double distances; 

    @Override 
    public int compareTo(LocationDistances anotherLocation) { 
     double otherLocDistances = ((LocationDistances)anotherLocation).getDistances(); 

     /* ascending order */ 
     return this.distances - otherLocDistance; 

     /* descending order */ 
     //return otherLocDistance - this.distances; 
    } 
} 

E quindi chiamare:

ArrayList<LocationDistances> locsDis = new ArrayList(Arrays.asList(
    new LocationDistances("abc",23.234556), 
    new LocationDistances("xyz",3.3444566), 
    . . . 
    . . . 
    . . . 

)); 
Collections.sort(locsDis); 
1

Utilizzare una coda di priorità con un comparatore personalizzato. (Usa sondaggio/peek per il valore minimo)

public class MyComparator implements Comparator<LocationDistance> 
{ 
    @Override 
    public int compare(LocationDistance ld1, LocationDistance ld2) 
    { 
    return Double.compare(ld1.distances, ld2.distances); 
    } 
} 
...... 
...... 
PriorityQueue collection = new PriorityQueue<LocationDistance>(5, new MyComparator()); 
0

Questo è ciò che state cercando:

import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.Collections; 


public class Run { 
    public static void main(String[]args){ 
     ArrayList<LocationDistances> locsDis = new ArrayList(Arrays.asList(
       new LocationDistances("abc",23.234556), 
       new LocationDistances("xyz",3.3444566))); 

     ArrayList<Double> distances = new ArrayList<Double>(); 
     for (LocationDistances locationDistances : locsDis) { 
      distances.add(locationDistances.getDistances()); 
     } 
     double minimum = Collections.min(distances); 
     System.out.println(minimum); 
    } 
} 

class LocationDistances { 

    public LocationDistances(String locs, double distances) { 
     this.locs = locs; 
     this.distances = distances; 
    } 
    String locs; 
    double distances; 
    public String getLocs() { 
     return locs; 
    } 
    public void setLocs(String locs) { 
     this.locs = locs; 
    } 
    public double getDistances() { 
     return distances; 
    } 
    public void setDistances(double distances) { 
     this.distances = distances; 
    } 

} 
Problemi correlati