Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用map-Java的键从值中选择最高的数据_Java_Date_Dictionary_Arraylist - Fatal编程技术网

使用map-Java的键从值中选择最高的数据

使用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/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有三个版本,在“|”符号之前用数字表示。我只想要任何月份的最新版本的产品

在这里,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 ) …