0

tabs.generateTab()タブを表示するかどうかを設定する動的メソッド ヘルプを作成しています。Property見せられたい、見せられたくInfoない、など。Propertyタブを表示したい。私はこのように渡しています:

String nextTab = getNextTab("Property");

次に、getNextTabメソッドであるかどうかPropertyをチェックしtrueます。そうであるfalse場合、メソッドは次の値を返す必要がありtrueます。

public LinkedHashMap generateTab() {
    LinkedHashMap selectedTabs = new LinkedHashMap();
    selectedTabs.put("People", true);
    selectedTabs.put("Property", true);
    selectedTabs.put("Info", false);
    selectedTabs.put("Fixture", true);
    selectedTabs.put("Fee", true);
    selectedTabs.put("Process", true);
}

public String getNextTab(String currentTab) {

    String nextTab = null;
    Map<String, Boolean> tabList = generateTab();
    Iterator iterator = tabList.keySet().iterator();

    while (iterator.hasNext()) {
        Map.Entry entry = (Map.Entry) iterator.next();
        if (entry.getKey().equals(currentTab)) {
            if (tabList.get(entry.getKey()).equals(true)) {
                nextTab = entry.getKey().toString();
                break;
            }
        }
    }
    return nextTab;
}

他にチェックインされている次のキーを取得するのを手伝ってもらえますか?

4

4 に答える 4

1

生の型

さて、ここでの最初の問題は、 raw LinkedHashMap、 raw Iterator、および rawを使用することですMap.Entry。これは、特にコードで、あらゆる種類の実行時エラーにつながります。すべてを. _<>

LinkedHashMapまず、入力するように変更しましょう。

public LinkedHashMap<String, Boolean> generateTab() {
    LinkedHashMap<String, Boolean> selectedTabs = new LinkedHashMap<String, Boolean>();
    selectedTabs.put("People", true);
    selectedTabs.put("Property", true);
    selectedTabs.put("Info", false);
    selectedTabs.put("Fixture", true);
    selectedTabs.put("Fee", true);
    selectedTabs.put("Process", true);
    return selectedTabs;
}

次に、 に追加しますIterator。あなたのコードから、 から を期待していることは明らかなMap.EntryのでIterator、それから始めましょう。

Iterator<Map.Entry> iterator = tabList.keySet().iterator();

これをコードに入力すると、エラーが発生します。

Iterator<String>型の不一致: からに変換できませんIterator<Map.Entry>

これは、あなたが思っていたようにイテレータがタイプされていないことを意味します。Map.Entryこれは、あなたが思っていたのとは異なり、 からkeySeta を返すためです。あなたが欲しいのはです。ただし、これを入力すると、次のように表示されます。Set<K>LinkedHashMapSet<Entry<K, V>>tabList.entrySet().iterator()

Iterator<Map.Entry<String,Boolean>>型の不一致: からに変換できませんIterator<Map.Entry>

したがって、 も に追加する<String, Boolean>必要がありMap.Entryます。

Iterator<Map.Entry<String, Boolean>> iterator = tabList.entrySet().iterator();

他のいくつかの小さなこと。これを変更したので、a)getKey().toString()呼び出しを just に置き換えgetKey()(現在は文字列であるため)、b) yourtabList.get(entry.getKey()).equals(true)を just に置き換えますentry.getValue()(現在はブール値であるため)。

これで問題が解決したので、コードは次のようになります (問題に対処する前)。

public LinkedHashMap<String, Boolean> generateTab() {
    LinkedHashMap<String, Boolean> selectedTabs = new LinkedHashMap<String, Boolean>();
    selectedTabs.put("People", true);
    selectedTabs.put("Property", true);
    selectedTabs.put("Info", false);
    selectedTabs.put("Fixture", true);
    selectedTabs.put("Fee", true);
    selectedTabs.put("Process", true);
    return selectedTabs;
}

public String getNextTab(String currentTab) {
    String nextTab = null;
    Map<String, Boolean> tabList = generateTab();
    Iterator<Map.Entry<String, Boolean>> iterator = tabList.entrySet().iterator();
    while (iterator.hasNext()) {
        Map.Entry<String, Boolean> entry = iterator.next();
        if (entry.getKey().equals(currentTab)) {
            if (entry.getValue()) {
                nextTab = entry.getKey();
                break;
            }
        }
    }
    return nextTab;
}

次のタブを取得する

私の理解が正しければ、現在のタブを見つけて、その後のタブをマップに戻す必要がありますよね?

編集:わかりました。非表示/表示の値が である次のものが必要ですtrue

これを行うには、すでにイテレータがあるので、それを使用するだけです。現在のタブにいる場合:

  1. イテレータに何か残っているかどうかを確認する
  2. 存在する場合は、イテレータで次の値を取得します (いわば次のタブ)。
  3. 存在しない場合は、反復子を更新して最初の値を取得します (最後に到達したため、先頭に戻ります)。
  4. 見えますか?ある場合は返却し、そうでない場合は続行します。

これにより、現在選択されているタブの後に表示される最初のタブが返されます。タブのみが表示されているタブが選択されている場合、そのタブが再び返されます。タブが表示されていない場合にこれを呼び出す場合は注意してください。すべてのタブが非表示になっていると無限ループが発生するため、これが発生しないことを確認してください。

これにより、ループが次のように変更されます。

while (iterator.hasNext()) {
    Map.Entry<String, Boolean> entry = iterator.next();
    if (entry.getKey().equals(currentTab)) {
        if (entry.getValue()) {
            while (true) {
                if (iterator.hasNext()) {
                    entry = iterator.next();
                } else {
                    // Get a fresh iterator and get its first element
                    iterator = tabList.iterator();
                    entry = iterator.next();
                }
                if (entry.getValue()) {
                    return entry.getKey();
                }
            }
        }
    }
}

そして、そこに行きます!2 つのループから抜け出すには、a) 2 番目のループが終了した後に最初のループを終了させるための変数、または b)ブレークするステートメントのラベルのいずれかが必要であるため、return代わりにを使用する必要があったことに注意してください。オプション、本当に。breakbooleanbreak

于 2012-10-05T06:31:48.620 に答える
1

コードに複数の問題があるようです

1) public LinkedHashMap generateTab(): LinkedHashMap を返すのが理想的です。(コピペエラーだと思います)

2) : これは、文字列を Map.Entry にキャストiterator.next()するための を返す必要があります。ClassCastException

3) nextTab を返すにiterator.next()は、イテレータを次の項目に移動するために 1 回呼び出す必要があります。

getNextTab()関数を次のように変更します。

public static String getNextTab(String currentTab) {

    String nextTab = null;
    Map<String,Boolean> tabList = generateTab();
    Iterator iterator = tabList.keySet().iterator();

    while (iterator.hasNext() ){
        String entry =(String) iterator.next();

         if(entry.equals(currentTab))
         {
             if(tabList.get(entry).equals(true))
             {

                 nextTab = entry;
                 break;
             } 
             else
             {
                nextTab =(String) iterator.next();
                break;
             }

         }

     }
     return nextTab;
}
于 2012-10-05T06:11:38.813 に答える
0

不要なロジックを削除すると、コードは次のようになります

public String getNextTab(String currentTab) {
    Map<String, Boolean> tabList = generateTab();
    boolean shouldStart = false;
    for (Map.Entry<String, Boolean> value : tabList.entrySet()) {
        if (value.getKey().equals(currentTab)) {
            shouldStart = true;//to check if we have found entry7
            continue;
        }
        if (shouldStart) {
            if (value.getValue().equals(true))
                return value.getKey();//return the key which has next value true
        }
    }
    return null;
}

出力

getNextTab("Property")-->Fixture
于 2012-10-05T06:18:23.737 に答える
0

これを試して..

for(Map.Entry<String,Boolean> arr : tabList.entrySet()){

     if(arr.getKey().equals("Property")){


             if(arr.getValue()){

                 // Do something is Property is True

            }else{

                 // Do something is Property is False

            }


}
于 2012-10-05T06:18:25.910 に答える