询问具有以下属性的特定Java集合

时间:2014-04-21 19:56:13

标签: java collections

我想问一下我可以在我的项目中使用的集合。以下是我的要求。

  1. 它有键值对。 一个是移动领域,另一个是距离。
  2. 移动字段是唯一的,但距离不是唯一的。
  3. 应将它们存储为距离场的升序。
  4. 我不希望删除重复距离(密钥对)。

    我已经尝试使用TreeMap将距离作为键和移动作为值。

    但它正在删除重复项。我也不能把手机当成钥匙,因为, 否则它将根据移动的价值对该对进行排序。所以请告诉我该怎么做。

    TreeMap tree = new TreeMap();
    while(rs.next()){  
    // obtaining dist and mob values here
        tree.put(dist, mob);
    }
    Set set=tree.entrySet();  
    Iterator itr=set.iterator();  
    out.println("distance   " + "mobile");
    while(itr.hasNext()){  
        Map.Entry m=(Map.Entry)itr.next();  
        out.println(m.getKey()+"   "+m.getValue()+"\n");  
    }  
    
  5. 我希望按照相应的增加距离的顺序获取所有移动电话号码。这是我到目前为止所尝试的,但问题是它消除了重复的距离。

3 个答案:

答案 0 :(得分:2)

如果要为每个键保留多个值,则需要MultiMap。番石榴有几个,包括一对具有排序值的夫妇。例如,查看TreeMultiMap

  

Multimap的实现,其键和值按其自然顺序或提供的比较器排序。

答案 1 :(得分:1)

使用与

参数相同的TreeMap
TreeMap<Integer, LinkedList<Integer>> tMap=new TreeMap<Integer, LinkedList<Integer>>();

这里将距离视为关键,将mobileNo视为值。根据您的陈述,对于相同的距离,有几个mobileNo值(因为距离不是唯一的)。因此,对于value字段,我们可以使用LinkedList或ArrayList。

TreeMap将以排序的方式存储密钥。因此,您可以根据密钥和密钥的所有值打印TreeMap。

完整代码如下:

import java.util.Collections;
import java.util.LinkedList;
import java.util.TreeMap;

public class MultiValueCollection {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        MultiValueCollection mCollection=new MultiValueCollection();
        TreeMap<Integer, LinkedList<Integer>> tMap=new TreeMap<Integer, LinkedList<Integer>>();


        mCollection.addMobileNumberByDistance(tMap, 40, 65655423);
        mCollection.addMobileNumberByDistance(tMap, 40, 76785647);
        mCollection.addMobileNumberByDistance(tMap, 40, 85785852);
        mCollection.addMobileNumberByDistance(tMap, 40, 96786344);
        mCollection.addMobileNumberByDistance(tMap, 40, 57657354);

        mCollection.addMobileNumberByDistance(tMap, 20, 13543353);
        mCollection.addMobileNumberByDistance(tMap, 20, 23453456);

        mCollection.addMobileNumberByDistance(tMap, 30, 33353544);
        mCollection.addMobileNumberByDistance(tMap, 30, 43534554);
        mCollection.addMobileNumberByDistance(tMap, 30, 59789785);


        mCollection.printMobileNumbersByDistance(tMap);
    }

    public void addMobileNumberByDistance(TreeMap<Integer, LinkedList<Integer>> tMap, int distance, int mobileNo)
    {
        LinkedList<Integer> list=null;
        if(tMap.get(distance)==null)
        {
            list=new LinkedList<Integer>();
        }else
        {
            list=tMap.get(distance);
        }
        list.push(mobileNo);
        tMap.put(distance, list);
    }

    public void printMobileNumbersByDistance(TreeMap<Integer,LinkedList<Integer>> distNumberMap)
    {
        LinkedList<Integer> list;
        for(int n : distNumberMap.keySet())
        {
            list=distNumberMap.get(n);
            Collections.sort(list);//Add this line if mobileNo needs to be sorted for a given distance
            for(int k : list)
            {
                System.out.println("key "+n+" value "+k);
            }
        }
    }
}

答案 2 :(得分:0)

有几种方法可以实现这一点。以下是您可能没有考虑但可能有效的方法:

1)定义一个包含&#34;键&#34;的新类。和&#34;价值&#34;作为实例字段。

2)实现Comparable接口,即编写自己的订购规则,包括如何处理打折。

3)使用通过Comparable进行排序的集合。