2015-04-17 15 views
5

Mam klasyWybierz obiekt na podstawie jego minimalnej wartości atrybutu z listy w Javie

public class LocationDistances { 
    String locs; 
    double distances; 

} 

i ArrayList składa się z LocationDistances obiektów w innej klasie

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

)); 

Jak wybrać LocationDistances .locs z listy Array na podstawie minimalnej wartości LocationDistances.distance z locsDis arrayList?

+0

Można zastąpić '' equals' i metod hashcode' z 'Object' klasie. Lub możesz napisać Komparator, aby posortować listę z minimalną odległością na górze, aby móc ją pobrać jako pierwszy element na liście. –

Odpowiedz

4

Coś jak to będzie działać, jeśli nie ma duplikatów odległości.

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

jeśli istnieją zduplikowane odległości użyć coś takiego

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

Jeśli używasz Java 8 (należy :)):

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

Edycja: postanowiłem zrobić ten post nieco bardziej wszechstronny, aby pomóc ci z nas, które są nadal ograniczone do Java < 8 ale może użyj niesamowite guawa biblioteki :)

Java 6 & 7 z guawy (biblioteka Google util):

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

Zakłada to, że 'distance()' zwraca 'Double'. Lepiej używać 'Double.compare'. –

+0

To nadal nie działa. 'first.distances' to' double', a nie 'Double'. Nie możesz wywołać 'compareTo' na prymitywie. –

+0

ha, widzę teraz twój punkt widzenia na poprawkę :) il edit. –

0

@ David Limkys ma rację, to byłoby rozwiązanie w Javie 8, dla java 6 & 7 następowałaby zrobić.

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);' nie działa. W przeciwnym razie różnica może być równa zeru, gdy dwa oryginalne "podwójne" nie są równe. –

+0

prawda, alternatywnie, moglibyśmy je porównać i zwrócić '0,1, -1' ale myślę, że byłem leniwy :) –

0

Możliwe jest zaimplementowanie opcji Porównywalne na Dyskach lokalizacji i posortowanie tablicy ArrayList za pomocą komparatora dla odległości w porządku rosnącym.

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; 
    } 
} 

a następnie zadzwonić:

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

)); 
Collections.sort(locsDis); 
1

używać kolejki priorytetowej z niestandardowym porównawczej. (Użyj poll/Peek do wartości minimalnej)

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

To jest to, co szukasz:

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; 
    } 

}