Java树集在地图中

时间:2013-02-22 23:02:10

标签: java

Java新手,我想要做的是检索一个字符串名称,如果其中一个值在一个范围内,则会打印到屏幕上,如下所示:

public class SuperHeroes {
private Map<String, Set<Integer>> names;
private Set<Integer> pageNum;

    /**
     * Constructor for objects of class SuperHeroes
     */
    public SuperHeroes() {
        names = new HashMap<>();
        pageNum = new TreeSet<>();
    }

    /**
     * The fill() method creates 2 entries.
     */
    public void fill() {
        pageNum.add(1);
        pageNum.add(3);
        pageNum.add(7);
        names.put("Kent,Clark", pageNum);

        pageNum = new TreeSet<>();
        pageNum.add(2);
        pageNum.add(6);
        pageNum.add(4);
        names.put("Wayne,Bruce", pageNum);
    }

    public void findInRange(int num, int numb) {
        for (String eachName: names.keySet()) {
            for (int eachNum:pageNum) {
                if(eachNum >= num && eachNum <= numb) {
                    System.out.println(names.get(eachName));
                }
            }      
        }
    }
}

如果pageNum在范围内,则打印到屏幕的结果将是超级英雄的名称。我得到的thr输出是所有数字。我们将非常感激地提供任何帮助。如果你能指出我正确的方向将是一个帮助。

提前谢谢。

6 个答案:

答案 0 :(得分:1)

您的代码中的第一个错误是您定义名称和pageNum的方式。它应该是这样的:

public SuperHeroes() 
{
    names = new HashMap<String, Set<Integer>>();
    pageNum = new TreeSet<Integer>();
}

现在,您可以使用subSet() Treeset方法来实现您的目标。代码如下:
编辑
Treeset检索给定名称的names时,需要将返回值强制转换为TreeSet类型。将subset方法与tSet一起使用时,同样如此。

   public void findInRange(int num, int numb) 
    {
        for (String eachName: names.keySet()) 
        {
            TreeSet<Integer> tSet = (TreeSet<Integer>)names.get(eachName);
            TreeSet<Integer> subSet = new TreeSet<Integer>();
            subSet = (TreeSet<Integer>)tSet.subSet(num,true,numb,true);//for JDK 1.6 or above. returns num<=numbers<=numb
            //TreeSet<Integer> subSet = tSet.subSet(num-1, numb+1);//for JDK version less than 1.6
            if (subSet.size() != 0)
            {
                System.out.println("Hero is "+eachName);
                break;//you can ommit it if you want to print all heroes having pagenum in range num to numb
            }
        }      
    }

fill方法也需要修改为:

public void fill() 
{
    pageNum.add(1);
    pageNum.add(3);
    pageNum.add(7);
    names.put("Kent,Clark", pageNum);

    pageNum = new TreeSet<Integer>();//Use proper way of object construction with generics
    pageNum.add(5);
    pageNum.add(6);
    pageNum.add(4);
    names.put("Wayne,Bruce", pageNum);
}

答案 1 :(得分:0)

首先,您必须使用超级英雄的名称来获取树集,然后读取树中的每个项目并将其与您需要的数字进行比较,如果比较为真,则打印超级英雄的名称。

看看这个链接

http://www.easywayserver.com/blog/java-treeset-example/

祝你好运

答案 2 :(得分:0)

你告诉它用行

打印与找到的名字相对应的数字
                System.out.println(names.get(eachName));

如果您只想显示名称,那应该只是

                System.out.println(eachname);

答案 3 :(得分:0)

我们都在猜这里。也许你需要这个:

public void findInRange(int num, int numb)

    {

        for (String eachName : names.keySet())

        {
            for (int eachNum : pageNum)

            {

                if (eachNum >= num && eachNum <= numb)

                {
                    for (int temp = 0; temp < eachNum; temp ++)
                    {
                    System.out.println(eachName);
                    }
                }
            }

        }
    }

答案 4 :(得分:0)

想知道,你已经在构造函数中初始化了一个pageNum,为什么要在方法fill()中创建另一个?这可能是因为构造函数中的那个可能会在填充方法中“隐藏”第二个。

答案 5 :(得分:0)

如果有人感兴趣我用以下代码解决了这个问题:

public void findInRange(int num, int numb)
{
 for(String eachName: names.keySet())
 {
   pageNum = names.get(eachName);
   for (int eachNum:pageNum)
   {
    if(eachNum>=num&&eachNum<=numb||eachNum>=numb&&eachNum<=num)
    {
        System.out.println(eachName);
        break;
    }
   }
 }
}