我有一个PersonList,它包含一个float属性。我想做的是获取我的Arraylist的最小值和最大值来显示它们。
public class Person implements Serializable {
private float myvalue;
private Date date;
//getters setters...
我尝试使用Collections.min(mylist)
和Collections.max(mylist)
,但似乎我必须覆盖比较器。
然后我的第二个问题是我想找到mylist
的每个元素,这些元素在date属性中具有相同月份(同年),但我真的不知道如何做到这一点。
希望有人可以帮助我!
答案 0 :(得分:3)
假设你有一个人的数组列表......
Collection<Person> people = new ArrayList<>();
这是你获得最大值和最小值的人
Person maxValuePerson = people.parallelStream()
.max(Comparator.comparing(p -> ((Person) p).getMyValue()))
.get();
Person minValuePerson = people.parallelStream()
.min(Comparator.comparing(p -> ((Person) p).getMyValue()))
.get();
然后,您可以使用Map<People>
和Calendar
实例按月对人员进行分组,如下所示:
HashMap<Integer,ArrayList<Person>> monthMap = new HashMap<>();
Calendar cal = Calendar.getInstance(); //expensive operation... use sparingly
for (Person p : people){
cal.setTime(p.getDate()); //Sets this Calendar's time with the person's Date.
int month = cal.get(Calendar.MONTH); //gets int representing the month
ArrayList<Person> monthList = monthMap.get(month);
//initialize list if it's null (not already initialized)
if(monthList == null) {
monthList = new ArrayList<>();
}
monthList.add(p); //add the person to the list
// put this month's people list into the map only if it wasn't there to begin with
monthMap.putIfAbsent(month, monthList);
}
总而言之,这是一个可以测试的完整工作示例:
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.Random;
public class MinMaxTest {
public static void main(String[] args) {
Random rand = new Random();
//Assuming an array list of people...
Collection<Person> people = new ArrayList<>();
for (int i = 0; i < 50; i++){
Person p = new Person();
p.setMyvalue(rand.nextFloat());
p.setDate(new Date(rand.nextLong()));
people.add(p);
}
//This is how you get the max and min value people
Person maxValuePerson = people.parallelStream()
.max(Comparator.comparing(p -> ((Person) p).getMyValue()))
.get();
Person minValuePerson = people.parallelStream()
.min(Comparator.comparing(p -> ((Person) p).getMyValue()))
.get();
//to group the people by month do the following:
HashMap<Integer,ArrayList<Person>> monthMap = new HashMap<>();
Calendar cal = Calendar.getInstance();
for (Person p : people){
cal.setTime(p.getDate());
int month = cal.get(Calendar.MONTH);
ArrayList<Person> monthList = monthMap.get(month);
if(monthList == null)
monthList = new ArrayList<>();
monthList.add(p);
monthMap.putIfAbsent(month, monthList);
}
for(Integer i : monthMap.keySet()){
System.out.println("Month: "+ i);
for(Person p : monthMap.get(i)){
System.out.println(p);
}
}
}
static class Person implements Serializable {
private float myvalue;
private Date date;
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public float getMyValue() {
return myvalue;
}
public void setMyvalue(float myvalue) {
this.myvalue = myvalue;
}
}
}
答案 1 :(得分:0)
提示(因为这是一个家庭作业问题):
首先要有你的类实现:
implements Comparator<Person>
然后执行以下操作:
public int compareTo(Object anotherPerson) throws ClassCastException {
if (!(anotherPerson instanceof Person))
throw new ClassCastException("A Person object expected.");
int yourValue = ((Person) anotherPerson).getYourValue();
return (this.yourValue - yourValue);
}
答案 2 :(得分:0)
实施Comparable接口
implements Serializable, Comparable<Person>
并覆盖compareTo方法
@Override
public int compareTo(Person o) {
int value = (int) o.getAge();
return (int) (this.age - value);
}