Select an object based on its minimum attribute value from a list in Java

I have a class

public class LocationDistances { String locs; double distances; } 

and an ArrayList consisting of LocationDistances objects in another class

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

How to select LocationDistances.locs from a list of arrays based on the minimum LocationDistances.distance from locsDisList?

+5
source share
6 answers

Something like this will work if there are no duplicated distances.

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

if duplicate distances exist, use something like this

 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); } } 
+4
source

If you are using Java 8 (you should :)):

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

Edit: decided to make this post more complete to help those of us who are still limited to Java < 8 but can use awesome library guava :)

Java 6 and 7 Using guava (Google util library):

 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); 
+6
source

Use priority ordering with a custom Comparator. (Use poll / peek for the minimum value)

 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()); 
+1
source

@ David Limkis is right, that would be a solution in Java 8, for java 6 and 7, which would be.

 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
source

You can implement Comparable on LocationDistances and sort the ArrayList using a comparator for distance in ascending order.

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

And then call:

 ArrayList<LocationDistances> locsDis = new ArrayList(Arrays.asList( new LocationDistances("abc",23.234556), new LocationDistances("xyz",3.3444566), . . . . . . . . . )); Collections.sort(locsDis); 
0
source

This is what you are looking for:

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

All Articles