保持地图的顺序与[重复]之前的arrayList中的顺序相同

Posted

技术标签:

【中文标题】保持地图的顺序与[重复]之前的arrayList中的顺序相同【英文标题】:Keep the order of the map as in the arrayList before [duplicate] 【发布时间】:2015-08-25 18:42:17 【问题描述】:

我正在尝试将行合并为我的程序创建数据。目前Strings 在ArrayList缓冲区 中的合并部分运行良好,但是当我输出Map 的内容时,我得到了另一个StringArrayList缓冲区中。

有什么方法可以保持Strings 在ArrayList 缓冲区中的顺序

输出:

Nathan Marcus Adler 
[04:43, 05:43, 12:11, 12:41, 19:11, 19:41]
Dukes of Bedford 
[04:56, 05:56, 12:24, 12:54, 19:24, 19:54]
Prince Albert 
[04:48, 05:48, 12:16, 12:46, 19:16, 19:46]
Joseph Addison 
[04:41, 05:41, 12:08, 12:38, 19:08, 19:38]
William Baker 
[04:52, 05:52, 12:20, 12:50, 19:20, 19:50]

输出应如下所示:

Joseph Addison 
[04:41, 05:41, 12:08, 12:38, 19:08, 19:38]
Nathan Marcus Adler 
[04:43, 05:43, 12:11, 12:41, 19:11, 19:41]
Prince Albert 
[04:48, 05:48, 12:16, 12:46, 19:16, 19:46]
William Baker 
[04:52, 05:52, 12:20, 12:50, 19:20, 19:50]
Dukes of Bedford 
[04:56, 05:56, 12:24, 12:54, 19:24, 19:54]

代码:

public static void main(String[] args) 

    ArrayList<String> buffer = new ArrayList<String>();

    buffer.add("Joseph Addison 04:41 05:41");
    buffer.add("Nathan Marcus Adler 04:43 05:43");
    buffer.add("Prince Albert 04:48 05:48");
    buffer.add("William Baker 04:52 05:52");
    buffer.add("Dukes of Bedford 04:56 05:56");

    buffer.add("Joseph Addison 12:08 12:38 ");
    buffer.add("Nathan Marcus Adler 12:11 12:41");
    buffer.add("Prince Albert 12:16 12:46");
    buffer.add("William Baker 12:20 12:50");
    buffer.add("Dukes of Bedford 12:24 12:54");

    buffer.add("Joseph Addison 19:08 19:38");
    buffer.add("Nathan Marcus Adler 19:11 19:41");
    buffer.add("Prince Albert 19:16 19:46");
    buffer.add("William Baker 19:20 19:50");
    buffer.add("Dukes of Bedford 19:24 19:54");

    Map<String, List<String>> map = new HashMap<>();
    ArrayList<PlaceTime> list = new ArrayList<PlaceTime>();

    for (String element : buffer) 
        PlaceTime part = new PlaceTime(element);
        list.add(part);

    

    for (PlaceTime t : list) 
        if (map.containsKey(t.getPlace())) 
            // If the map already contains an entry for the place, add the
            // times to the array
            map.get(t.getPlace()).addAll(t.getTimes());
         else 
            // Map does not contain entry for place, create a new entry
            map.put(t.getPlace(), t.getTimes());
        
    

    // Print out contents of map
    for (Entry<String, List<String>> entry : map.entrySet()) 
        System.out.println(entry.getKey());
        System.out.println(entry.getValue());
    

    System.out.println("Test");


PlaceTime 类:

public class PlaceTime 
    StringBuilder place = new StringBuilder();
    List<String> times = new ArrayList<>();;

    public PlaceTime(String placeTime) 

        DateFormat dateFormat = new SimpleDateFormat("HH:mm");
        for (String i:placeTime.split(" ")) 
            try 
                dateFormat.parse(i);
                //No exception, add as time
                times.add(i);
             catch (Exception e) 
                //Exception, add as place name
                place.append(i).append(" ");
            
        
    

    public String getPlace() 
        return place.toString();
    

    public List<String> getTimes() 
        return this.times;
    

【问题讨论】:

你当前的输出和想要的输出没有区别。改写问题 使用LinkedHashMap代替,它维护插入顺序。 【参考方案1】:

使用TreeMap 进行自然排序或自定义排序,或使用LinkedHashMap 维护插入顺序:

LinkedHashMap 用于广告订单

Map 接口的哈希表和链表实现,具有可预测的迭代顺序。这个链表定义了迭代顺序,通常是键插入映射的顺序(insertion-order)

Treemap 用于自然或自定义排序

基于红黑树的 NavigableMap 实现。地图根据其键的自然顺序或在地图创建时提供的 Comparator 进行排序,具体取决于使用的构造函数。

而不是HashMap

这个类不保证地图的顺序;特别是,它不保证订单会随着时间的推移保持不变。

【讨论】:

TreeMap 将对插入进行排序,LinkedHashMap 是关键。 它不适用于 TreeMap 但它适用于 LinkedHashMap @MrAsker 检查我的编辑......【参考方案2】:

HashMap 没有按照定义放弃迭代顺序。添加新元素时它甚至会完全改变,因此不会保留顺序,请改用LinkedHashMap

它将根据需要按照条目放入地图的顺序进行迭代。

查看documentation

【讨论】:

以上是关于保持地图的顺序与[重复]之前的arrayList中的顺序相同的主要内容,如果未能解决你的问题,请参考以下文章

List 去除重复数据的五种方式,舒服~

List 去除重复数据的五种方式,舒服~

java List去除重复数据的五种方式

获取Java中arrayList中重复值的计数而不影响arrayList的顺序[重复]

保存 ArrayList<String> 以保持 [重复]

在 ArrayList 与 LinkedList 中间插入 [重复]