生の型
さて、ここでの最初の問題は、 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
これは、あなたが思っていたのとは異なり、 からkeySet
a を返すためです。あなたが欲しいのはです。ただし、これを入力すると、次のように表示されます。Set<K>
LinkedHashMap
Set<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
。
これを行うには、すでにイテレータがあるので、それを使用するだけです。現在のタブにいる場合:
- イテレータに何か残っているかどうかを確認する
- 存在する場合は、イテレータで次の値を取得します (いわば次のタブ)。
- 存在しない場合は、反復子を更新して最初の値を取得します (最後に到達したため、先頭に戻ります)。
- 見えますか?ある場合は返却し、そうでない場合は続行します。
これにより、現在選択されているタブの後に表示される最初のタブが返されます。タブのみが表示されているタブが選択されている場合、そのタブが再び返されます。タブが表示されていない場合にこれを呼び出す場合は注意してください。すべてのタブが非表示になっていると無限ループが発生するため、これが発生しないことを確認してください。
これにより、ループが次のように変更されます。
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
代わりにを使用する必要があったことに注意してください。オプション、本当に。break
boolean
break