使用map-Java的键从值中选择最高的数据
我有一个包含日期和产品发布类型的地图 示例(“2015/04/12”、“1 | Prod43”) 我的地图值:使用map-Java的键从值中选择最高的数据,java,date,dictionary,arraylist,Java,Date,Dictionary,Arraylist,我有一个包含日期和产品发布类型的地图 示例(“2015/04/12”、“1 | Prod43”) 我的地图值: 2015/08/27 1|Prod23 2015/12/15 1|Prod55 2016/04/08 1|Prod09 2016/04/09 2|Prod09 2016/04/12 3|Prod09 我想维护两个数组列表,dateList来包含键,prodList用于值。但约束条件是,在4月份,Prod09有三个版本,在“|”符号之前用数字表示。我只想要任何月份的最新版本的
2015/08/27 1|Prod23
2015/12/15 1|Prod55
2016/04/08 1|Prod09
2016/04/09 2|Prod09
2016/04/12 3|Prod09
我想维护两个数组列表,dateList
来包含键,prodList
用于值。但约束条件是,在4月份,Prod09有三个版本,在“|”符号之前用数字表示。我只想要任何月份的最新版本的产品
在这里,April有3个版本,我只想把第3个版本放到我的arrayList中
需要将我的arrayList设置为:
dateList -> ["2015/08/27","2015/12/15","2016/04/12"]
prodList - >["1|Prod23","1|Prod55","3|Prod09"]
代码:
{
Map dateMap=newtreemap();
dateMap.put(“2015/08/27”、“1 | Prod23”);
dateMap.put(“2015/12/15”、“1 | Prod55”);
dateMap.put(“2016/04/08”、“1 | Prod09”);
dateMap.put(“2016/04/09”,“2 | Prod09”);
dateMap.put(“2016/04/12”,“3 | Prod09”);
字符串test1=“”;
字符串test2=“”;
整数计数=0;
List prodList=new ArrayList();
List dateList=new ArrayList();
对于(Map.Entry:dateMap.entrySet())
{
String key=entry.getKey().substring(0,7);
字符串dateValue=entry.getValue();
如果((“”)等于(test1)){
test1=键;
test2=键;
}
如果(!(test2.equals(key))){
dateList.add(键);
prodList.add(dateValue);
test2=键;
}否则{
如果(计数成对观察:
- 用“|”字符连接表示您试图在一个值中保留两条数据。(这是一种糟糕的信息做法,如果您确实需要这两条数据,则创建一个新类,每个值都有一个字段。或者您可以使用列表的索引作为相对秩的隐式值,正如我在下面所做的)
- 映射(和其他数据结构)可以保存任何对象,包括
java.util.Date
(或更现代的时间类之一)、数组、列表等
- 不清楚为什么您希望从日期映射到产品发布
就您的问题而言,类似于以下地图的结构可能更有用:
{Product=>[ReleaseDate1,ReleaseDate2,…]}
其中,产品可能是“Prod23”、“Prod55”、“Prod09”等,映射的值可能是一个列表
或数组,可能为空。(列表
更容易添加)
要获取“Prod12”的最新发布日期,您可以执行以下操作:
dates = prodMap.get("Prod12");
lastDate = dates.get(dates.size()); // assuming they where inserted in order
有一些经过排序的集合(或者您可以提供一个比较器)可以确保集合的顺序。耦合观察:
- 用“|”字符连接表示您试图在一个值中保留两条数据。(这是一种糟糕的信息做法,如果您确实需要这两条数据,则创建一个新类,每个值都有一个字段。或者您可以使用列表的索引作为相对秩的隐式值,正如我在下面所做的)
- 映射(和其他数据结构)可以保存任何对象,包括
java.util.Date
(或更现代的时间类之一)、数组、列表等
- 不清楚为什么您希望从日期映射到产品发布
就您的问题而言,类似于以下地图的结构可能更有用:
{Product=>[ReleaseDate1,ReleaseDate2,…]}
其中,产品可能是“Prod23”、“Prod55”、“Prod09”等,映射的值可能是一个列表
或数组,可能为空。(列表
更容易添加)
要获取“Prod12”的最新发布日期,您可以执行以下操作:
dates = prodMap.get("Prod12");
lastDate = dates.get(dates.size()); // assuming they where inserted in order
存在已排序的集合(或者您可以提供一个比较器)这将确保收集的顺序。与其创建一个字符串的列表来保存日期,我更愿意准备一个日期的列表。除非格式相同,否则将字符串转换为日期并不难
这将帮助您转换问题代码中提供的当前格式
DateFormat format = new SimpleDateFormat("yyyy/MM/dd", Locale.ENGLISH);
Date date = format.parse("2016/04/26");
这是一个函数,它可以帮助您从提供的任意数量的日期中获取最新的日期
public static Date findLatest (Date... dates) {
Date date = dates[0];
for (int i = 1; i < dates.length; i++) {
if (dates[i].after(date)) {
date = dates[i];
}
}
return date;
}
公共静态日期findLatest(日期…日期){
日期=日期[0];
对于(int i=1;i
与其创建一个String
列表来保存日期,我更愿意准备一个Date
列表。除非格式相同,否则将String
转换为Date
并不难
这将帮助您转换问题代码中提供的当前格式
DateFormat format = new SimpleDateFormat("yyyy/MM/dd", Locale.ENGLISH);
Date date = format.parse("2016/04/26");
这是一个函数,它可以帮助您从提供的任意数量的日期中获取最新的日期
public static Date findLatest (Date... dates) {
Date date = dates[0];
for (int i = 1; i < dates.length; i++) {
if (dates[i].after(date)) {
date = dates[i];
}
}
return date;
}
公共静态日期findLatest(日期…日期){
日期=日期[0];
对于(int i=1;i
由于您使用的是TreeMap
,它是根据其键的自然顺序排序的,因此我们可以使用此属性编写一些代码。我可以快速编写此代码,也许它可以帮助您
Map<String, String> dateMap = new TreeMap<String, String>();
dateMap.put("2015/08/27", "1|Prod23");
dateMap.put("2015/12/15", "1|Prod55");
dateMap.put("2016/04/08", "1|Prod09");
dateMap.put("2016/04/12", "3|Prod09");
dateMap.put("2016/04/09", "2|Prod09");
String lastKey = "";
String currentKey = "";
List<String> date = new ArrayList<String>();
List<String> release = new ArrayList<String>();
for(Map.Entry<String, String> entry : dateMap.entrySet()) {
String temp = entry.getKey();
currentKey = temp.substring(0, 7);
if(currentKey.equals(lastKey)){ // another release in same month as previous release
// Remove last release details
date.remove(date.size() - 1);
release.remove(release.size() - 1);
// Add current release deetails
date.add(temp);
release.add(entry.getValue());
lastKey = currentKey;
} else { // first release in this month
// Add current release deetails
date.add(temp);
release.add(entry.getValue());
lastKey = currentKey;
}
}
由于您使用的是TreeMap
,它是根据其键的自然顺序排序的,因此我们可以使用此属性编写一些代码。我可以快速编写此代码,也许它可以帮助您
Map<String, String> dateMap = new TreeMap<String, String>();
dateMap.put("2015/08/27", "1|Prod23");
dateMap.put("2015/12/15", "1|Prod55");
dateMap.put("2016/04/08", "1|Prod09");
dateMap.put("2016/04/12", "3|Prod09");
dateMap.put("2016/04/09", "2|Prod09");
String lastKey = "";
String currentKey = "";
List<String> date = new ArrayList<String>();
List<String> release = new ArrayList<String>();
for(Map.Entry<String, String> entry : dateMap.entrySet()) {
String temp = entry.getKey();
currentKey = temp.substring(0, 7);
if(currentKey.equals(lastKey)){ // another release in same month as previous release
// Remove last release details
date.remove(date.size() - 1);
release.remove(release.size() - 1);
// Add current release deetails
date.add(temp);
release.add(entry.getValue());
lastKey = currentKey;
} else { // first release in this month
// Add current release deetails
date.add(temp);
release.add(entry.getValue());
lastKey = currentKey;
}
}
问题重新定义
map.put( "Prod09" , LocalDate.parse( "2016-04-09" ) );
map.put( "Prod09" , LocalDate.parse( "2016-04-12" ) );
// Calling `put` with dates arriving *not* in chronological-order.
Map< String , LocalDate> mapP = new HashMap<> ();
mapP.put ( "Prod23" , LocalDate.parse ( "2015-08-27" ) );
mapP.put ( "Prod55" , LocalDate.parse ( "2015-12-15" ) );
mapP.put ( "Prod09" , LocalDate.parse ( "2016-04-08" ) );
mapP.put ( "Prod09" , LocalDate.parse ( "2016-04-12" ) );
mapP.put ( "Prod09" , LocalDate.parse ( "2016-04-09" ) );
System.out.println ( "mapP: " + mapP );
// Calling `merge` with dates arriving *not* in chronological-order.
Map< String , LocalDate> mapM = new HashMap<> ();
BiFunction<LocalDate , LocalDate , LocalDate> latestLocalDate = ( ld1 , ld2 ) -> {
return ( ld1.isAfter ( ld2 ) ? ld1 : ld2 );
};
mapM.merge ( "Prod23" , LocalDate.parse ( "2015-08-27" ) , latestLocalDate );
mapM.merge ( "Prod55" , LocalDate.parse ( "2015-12-15" ) , latestLocalDate );
mapM.merge ( "Prod09" , LocalDate.parse ( "2016-04-08" ) , latestLocalDate );
mapM.merge ( "Prod09" , LocalDate.parse ( "2016-04-12" ) , latestLocalDate );
mapM.merge ( "Prod09" , LocalDate.parse ( "2016-04-09" ) , latestLocalDate );
System.out.println ( "mapM: " + mapM );
DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "yyyy/MM/dd" );
… LocalDate.parse( "2015/08/27" , formatter ) …