0

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 在该范围内,则打印到屏幕的结果将是超级英雄的名字。我目前得到的输出是所有数字。任何帮助将不胜感激。如果你能指出我正确的方向将是一个帮助。

先感谢您。

4

6 回答 6

1

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

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

现在你可以使用subSet()方法Treeset来实现你想要的。代码如下:
编辑:从返回值中
检索Treeset给定名称时,names需要进行类型转换以TreeSet键入。subset使用with 的方法时也要做同样的事情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);
}
于 2013-02-22T23:32:32.703 回答
0

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

看看这个链接

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

最好的祝福

于 2013-02-22T23:10:51.507 回答
0

你告诉它打印与找到的名称对应的数字与行

                System.out.println(names.get(eachName));

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

                System.out.println(eachname);
于 2013-02-22T23:20:37.513 回答
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);
                    }
                }
            }

        }
    }
于 2013-02-22T23:26:48.750 回答
0

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

于 2013-02-22T23:45:35.040 回答
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;
    }
   }
 }
}
于 2013-02-23T22:48:56.673 回答