2010-07-15 50 views
1

在指令中,我被要求「聲明一個接口類型來保存一個包含字符集作爲其鍵的映射,並將有序的字符串集作爲值」。所有這一次我一直在使用TreeSets。現在我不確定,我現在想用TreeMap來思考 。下面的代碼是我用過的演示TreeMap。首先可以按照上面的指令使用TreeSet而不是TreeMap。其次,當使用TreeMap for methodB()時,出現錯誤「非靜態變量名稱不能從靜態上下文中引用」?謝謝。TreeSet或TreeMap - 按指令

public class MyMates 
{ 

    private TreeMap names = new TreeMap(); 
    private static String[] name1 = null; 
    private static String[] name2 = null; 
    private static String[] name3 = null; 


    public MyMates() 
    { 
    super();  
    names = new TreeMap(); 
    } 

    public static void methodASet() 
    { 

    String[] name1 = new String[] {"Amy", "Jose", "Jeremy", "Alice", "Patrick"}; 
    String[] name2 = new String[] { "Alan", "Amy", "Jeremy", "Helen", "Alexi"}; 
    String[] name3 = new String[] { "Adel", "Aaron", "Amy", "James", "Alice" }; 
    } 

    public static String methodB(String aTemp) 
    { 

    for (int i = 0; i < name1.length; i++) 
    { 
    names.add(name1[i]); 
    } 
    System.out.println(names); 

    for (int i = 0; i < name2.length; i++) 
    { 
     names.add(name2[i]); 
    } 
    System.out.println(names); 

    for (int i = 0; i < name3.length; i++) 
    { 
     names.add(name3[i]); 
    } 
    System.out.println(names); 


    return aTemp 
    } 


    public static void populateTable() 
    { 
    girlFriends myList = new girlFriends(); 

    names.addAll(myList.getNames()); // same error here 
    } 
+0

首先,如果你被要求創建一個接口,我建議這樣做,而不是編寫實現。其次,'methodB'不能看到'name1','name2'和'name3',因爲它們的作用域是'methodASet'。 – Powerlord 2010-07-15 15:54:50

回答

1

「非靜態變量名稱不能從靜態上下文中引用」很容易解決。

您可以刪除methodB()的「static」修飾符。

另一種解決方案是將您的類成員「名稱」聲明爲static。

您的方法methodASet()有一個錯誤!您重新聲明name1,name2和name3爲本地變量。所以靜態類成員從不設置。

一個TreeSet和一個TreeMap有不一樣的功能:

  • 樹形圖是一個Map(inteface java.util.Map),也就是關聯鍵/值(鍵進行排序)
  • TreeSet是一個Set(接口java.util.Set):對象的有序集合,其中所有對象在集合中都是唯一的,沒有Map的「鍵」概念。

因此,您必須選擇與您的需求(通過按鍵訪問對象)相關的表示形式(Map或Set)。

+0

感謝Benoit Courtine – DiscoDude 2010-07-15 16:18:37

4

正如R. Bemrose在評論中所說,你並沒有被要求實現,只是一個接口。所以不要擔心實施。通過映射,您可以爲特定鍵(在您的情況下爲一組字符)輸入一個值(在您的案例中是一組有序字符串),並使用相同的鍵來檢索相同的值。那個界面會是什麼樣子?這就是問題所在。

+0

@dowln這實際上是目前爲止最好的建議。試試運氣定義一個界面,並詢問社區是否有問題。 – 2010-07-16 11:32:35

1

它看起來像私人TreeMap名稱不是靜態的,所以它不能從靜態方法訪問。也許你需要刷新你的靜態變量/方法? http://leepoint.net/notes-java/flow/methods/50static-methods.html

您必須記住methodASet和methodB是methodA中不同的方法和變量,methodB不能看到它。當你聲明String [] name1時,你正在創建一個String []類型的新變量,而不是使用類變量name1(你設置爲null)。從methodASet中的變量中刪除「String []」以重用類變量。

想一想,TreeMap是否有add()方法?我想你可能想切換到上述TreeSet或將add()方法更改爲put()。

對於populateTable(),你確定girlFriends是一個類型嗎?它來自哪裏?你確定你不是指myList是一個標準的java集合類型嗎?

希望我的(主要是錯綜複雜)的職位幫助!

編輯:爆炸!我想你是正確的。看起來他只需要編寫接口,而不是實現。

編輯:靜例子

Static method: 
Class.doSomething() 

Static variable: 
Class.count_something 

Class method: 
ObjectType obj = new ObjectType() 
obj.doSomething() 

Class variable: 
ObjectType obj = new ObjectType() 
obj.count_something
+0

girlFriends來自另一個有字符串設置返回類的類。我需要弄清楚是否要使用靜態? – DiscoDude 2010-07-15 16:17:42

+0

當你想讓沒有實例化的類具有方法和變量(沒有被實例化)時,使用靜態方法和變量。大多數情況下,您希望實例化(ObjectType obj = new ObjectType())擁有自己的變量,而不管其他實例如何操作。 編輯我的上述帖子,以幫助解釋 – shookster 2010-07-15 16:32:27

0

這是一種題外話,因爲它看起來像你的指示實際上是要你創建一個接口,而不是實現。然而,考慮到實現此接口的任務,如果持續使用Java術語(地圖,設置,字符和字符串),該指令似乎希望你保持這種數據結構:

Map<Set<Character>, SortedSet<String>> map; 

如果是這樣的情況下, ,TreeMap不是一個很好的實現選擇,因爲對非排序的集合執行排序非常困難。 Set不會爲初學者實現Comparable併爲您的TreeMap創建一個Comparator將需要一些複雜的邏輯。

如果上面是你的教練期待,我會建議使用HashMap具有使用設置爲一鍵式沒有問題:

map = new HashMap<Set<Character>, SortedSet<String>>();