2015-10-26 36 views
-2

是否可以創建一個有兩個孩子的地圖(TreeMap)? EX:如何創建一個有兩個孩子的地圖,擴展一個類似的父類?

我有兩個類,A和B,這兩個類都擴展C.我希望將BOTH A和B添加到同一個映射。每個類擴展C,但我不知道如何 - 顯然聲明如此:

Map<String, ? extends C> myMap = new TreeMap<String, ? extends C>(); 

不起作用。

我需要這個,因爲它會讓我的程序更容易將這兩個對象保留在同一張地圖中。從那裏,我可以簡單地檢查: if (map.get(key) instanceof A) {do what I want for A objects}

我也不希望將它們放到C類,因爲我一旦需要A和B類中的方法,一旦它們「出」地圖。

這兩個對象都執行類似的基本功能,但有非常不同的方法和字段,所以我真的不能解決這個問題,而不會不必要地「組合」它們,只是增加額外的變量來檢查,即(private static boolean isClassA;)我需要它們是單獨的類,但是在Map中它並不重要,因爲它們都擴展了C類並在它中共享了一個通用的必需方法。謝謝!

更多信息上的程序:

基本上類A和B按照從數據庫中讀取在一個短語集。它們的設置與此類似: map.put(「這是A類的一個短語」,新類A()); map.put(「B類短語」,新B類());

現在,我正在解析用戶輸入的段落。我比較用戶輸入的字符串,然後刪除與A類或B類共享密鑰的任何部分的主要問題。以下是與上述地圖值相關的示例:

「這是一個用於A類將被取出,B類的這個短語也將被刪除。「根據這個輸入,當我們循環瀏覽地圖(希望它將包含類A和類B)時,它將從字符串中刪除兩個實例。通過使用方法來剪切字符串(當在地圖的鍵中找到匹配項時),所以返回的字符串將是: 「將被取出,並且這也將被移除」。

現在,這裏是具有不同地圖的主要問題。我正在根據鍵的長度來排列地圖。所以首先會檢查更大的字符串,並且用戶句子將從最大字符串到最小字符串的順序被切斷。

希望你現在看到這個問題。如果我有兩張地圖,那麼當我檢查包含類A的鍵的用戶輸入時,它將從A類中的所有最大字符串到最小字符串。這意味着B類中的任何LARGE字符串(在A類搜索後通過搜索時)將被切斷。

例如:A類有鑰匙「我」和「我感覺好極了」 B類具有按鍵「我很高興」,「我覺得 給用戶一句:」我很高興和感覺好極了。

我們使用包含A類實例的第一張地圖進行搜索.A類(通過剪切方法)將從句子中移除「我是」。但是這是不正確的,因爲B班顯然有一個更長的字符串「我很高興」,它符合用戶的句子。如果我們同時含有A和B的地圖那麼我們將不得不在排序與鍵像這樣的地圖:

「我感覺好極了」(A類) 「我很高興」(B類) 「我感覺「(B類) 」我是「(A類)

因此,我們會得到B級結果修剪句子爲:」感覺很棒「,因爲B類與關鍵字」我感覺好極了」。

這是我需要它們在同一張地圖中的原因,只是按升序對它們進行排序,並確保它們正確修剪用戶字符串。我不能簡單地遍歷一個地圖,那麼其他:/

+0

我的意思地圖<字符串,?擴展C> myMap = new TreeMap ();不是它在那裏。 –

+0

你知道可以編輯你的文章嗎? –

+0

是的,但我不熟悉這個網站,我的評論有正確的形式。但由於某些原因,這些字符似乎已經干擾了我的問題的正確格式。基本上我說的是當我去編輯我原來的帖子它有正確的句子:「Map myMap = new TreeMap ()」,但是一旦我點擊接受它成爲你在我的文章中看到的。所以它必須對指定格式或字符的字符做些什麼。 –

回答

0

我知道你說過你不能將它們強制轉換爲classC,因爲你需要一些自定義的classA和classB方法。我可能會誤解某些東西,但不能在instanceof之後投給classA或classB。在那一刻,你已經知道什麼是類,因此可以投到A或B,然後使用自定義方法。

像這樣的東西(請讓我知道如果我在你的問題失去了一些東西):

package iseji.app.main; 

import java.util.HashMap; 
import java.util.Map; 

public class Main { 

    public static void main(String args[]){ 
     Map<String, ClassC> myMap = new HashMap<String, ClassC>(); 
     ClassA classA = new ClassA(); 
     ClassB classB = new ClassB(); 

     myMap.put("1", classA); 
     myMap.put("2", classB); 

     ClassC classC = myMap.get("1"); 
     if(classC instanceof ClassA){ 
      System.out.println("Is A"); 
      classC.printClassName(); 
      ((ClassA) classC).myClassAMethod(); 
     }else{ 
      System.out.println("Is B"); 
      classC.printClassName(); 
      ((ClassB) classC).myClassBMethod(); 
     } 

    } 
} 
+0

嘿,我確實得到它的工作。主要的問題是在打印地圖時,我很愚蠢地使用Entry e和if if(e instaceof A)來打印。很明顯,e不是A類的一個實例,它是一個Entry,所以我的程序正在工作,我只是沒有正確地打印出來。「讓我快速測試並期待錯誤。 –

0

你可以使用Map<String, C> myMap = new TreeMap<String, C>()

它將接受一個擴展C

Edit(對於Luigi的評論)任何類:此就是爲什麼我們有繼承權。你不需要在得到它之後將結果轉換回A或B,只需要在A和B中使用不同實現的常用方法,並且不需要任何代碼if (myMap.get(key) insnanceof A) { do blabla}

+0

我準備寫這個。爲了更快。 –

+0

請仔細閱讀下面的問題:*我也不希望把它們放到C類中,因爲一旦它們出現在地圖*之外,我就分別需要類A和B中的方法。基於此,該解決方案將無法實現。 –

+0

我試過了,但每當我嘗試打印出我的地圖中什麼都沒有顯示出來。在將類轉換爲C,B或A時沒有任何打印(請注意,所有類都覆蓋了toString方法,因此應該打印)。我會再看看,看看我能不能打印任何東西,但到目前爲止它只是不工作:( –

相關問題