0

Java初心者、私がやろうとしているのは、複数の値の1つが次の範囲内にある場合に画面に出力される文字列名を取得することです:

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

コードの最初の間違いは、names と pageNum の定義方法です。次のようにする必要があります。

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

subSet()のメソッドを使用Treesetして、探しているものを実現できます。コードは次のとおりです。
編集:返された値から特定の名前を
取得する間、型に型キャストする必要があります。でメソッドを使用している間も同じことが行われます。TreesetnamesTreeSetsubsettSet

   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

コンストラクターで pageNum を初期化したのに、なぜメソッドで別のページを作成するのfill()でしょうか? これはおそらく、コンストラクター内のものが fill メソッド内の 2 番目のものから「隠れている」可能性があるためです。

于 2013-02-22T23:45:35.040 に答える
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

誰かが興味を持っているなら、私は次のコードでこれを解決しました:

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 に答える
0

見つかった名前に対応する番号を次の行で出力するように指示しています

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

名前だけを表示したい場合は、

                System.out.println(eachname);
于 2013-02-22T23:20:37.513 に答える