List<Map<String,List<List<Double>>>> 获取重复值

List>>> ,如何得到map的List>中List 重复的值以及map的key, 数据格式也就是:List,<经度,纬度>>>>,一个map就代表一条线路,线路由很多个带有经纬度的点组成,要得到哪些线路在哪段路重叠了,急求

 List<Map<String,List<List<Double>>>> x = ...
for (Map<String,List<List<Double>>> x1 : x)
{
for (List<List<Double>> x2 : x1.values())
{
for (List<Double> x3: x2)
{
for (Double d : x3)
{
...
}
}
}
}

为什么不抽象成对象类,这样看的都晕啊,抽象成对象 比如map 对象 有个id就是key,然后有和map ,以此类推,重复的检查在各个类里面,这样写就只能for循环操作

package com.xxp;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class Test {

public static void main(String[] args) throws FileNotFoundException, IOException {

    List<Map<String, List<Double>>> list = new ArrayList<Map<String, List<Double>>>();

    Map<String, List<Double>> map1 = new HashMap<String, List<Double>>();
    List<Double> list1 = new ArrayList<Double>();
    list1.add(1d);
    list1.add(2d);
    list1.add(3d);
    list1.add(4d);
    list1.add(5d);
    list1.add(6d);
    list1.add(7d);
    list1.add(8d);
    map1.put("1", list1);
    List<Double> list11 = new ArrayList<Double>();
    list11.add(8d);
    map1.put("2", list11);
    List<Double> list12 = new ArrayList<Double>();
    list12.add(8d);
    map1.put("3", list12);
    list.add(map1);




    Map<String, List<Double>> map2 = new HashMap<String, List<Double>>();
    List<Double> list2 = new ArrayList<Double>();
    list2.add(1d);
    list2.add(2d);
    list2.add(3d);
    list2.add(4d);
    map2.put("1", list2);
    List<Double> list21 = new ArrayList<Double>();
    list21.add(4d);
    map2.put("2", list21);
    List<Double> list22 = new ArrayList<Double>();
    list22.add(4d);
    map2.put("3", list22);
    list.add(map2);





    Map<String, List<Double>> map3 = new HashMap<String, List<Double>>();
    List<Double> list3 = new ArrayList<Double>();
    list3.add(1d);
    list3.add(2d);
    list3.add(3d);
    list3.add(4d);
    list3.add(5d);
    list3.add(6d);
    map3.put("3", list3);
    list.add(map3);



    List<Map<String, List<Double>>> same_list = new ArrayList<Map<String, List<Double>>>();

    for(int i = 0; i < list.size(); i++){   //便利所有路线集合
        Map<String, List<Double>> same_map = new HashMap<String, List<Double>>();

        Map<String, List<Double>> map = list.get(i); 
        Set<String> keys = map.keySet();
        Iterator<String> keys_it = keys.iterator();
        while(keys_it.hasNext()){  //便利当前路线所走的经纬度
            String key = keys_it.next();
            List<Double> value = map.get(key);
            for(int j = i + 1; j < list.size(); j++){//用当前路线与其他路线做对比,直对比集合中,当前路线之后的
                Map<String, List<Double>> map_after = list.get(j);
                if(map_after.containsKey(key)){  //如果之后的路线中有和现在路线经度相同的,则进行便利,查看是否存在维度相同数据
                    List<Double> _same_list = compareList(value, map_after.get(key));

                    if(_same_list != null && !_same_list.isEmpty() && _same_list.size() > 0){
                        System.out.println( "--------------" + key + "      " + Arrays.toString(_same_list.toArray()));
                        same_map.put(key, _same_list);
                    }
                }
            }
        }

        same_list.add(same_map);
    }



    System.out.println(same_list.size());



}

public static List<Double> compareList(List<Double> list, List<Double> list_after){
    List<Double> same_list = new ArrayList<Double>();
    for(Double d : list){
        for(Double _d : list_after){
            System.out.println(d + "         " + _d);;
            if(d.doubleValue() == _d.doubleValue()){
                same_list.add(d);
            }
        }
    }
    return same_list;
}

}

不知道是不是你想要的,仅供参考哈,嘿嘿,更希望能分享一些比较好的解决算法。

可以把数据转为java.awt.geom.Line2D
Line2D 表示 (x, y) 坐标空间内的线段。像 Java 2D API 的所有类一样,此类使用称为用户空间 的默认坐标系统,其中 Y 轴的值向下增大,X 轴的值向右增大。有关用户空间坐标系统的更多信息,请参阅《Java 2D Programmer's Guide》中的 Coordinate Systems 部分。

此类是所有存储 2D 线段对象的惟一抽象超类。坐标的实际存储表示形式要靠子类来完成。

里面有提高相应的方法:
比如
public boolean intersectsLine(Line2D l)测试指定的线段是否与此线段相交。