TreeSet或TreeMap - 根据指令

时间:2010-07-15 15:49:41

标签: java

在说明书中,我被要求“声明一个接口类型来保存带有字符集作为其键的映射,并使用有序的字符串集作为值”。这段时间我一直在使用TreeSet。现在我不确定,我现在 考虑使用TreeMap。下面的代码是我使用的演示TreeMap。首先,按照上面的说明使用TreeSet而不是TreeMap是可以接受的。其次,当使用TreeMap for methodB()时,我收到错误“非静态变量名不能从静态上下文引用”?谢谢。

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
  }

4 个答案:

答案 0 :(得分:4)

正如R. Bemrose在评论中所说,你不会被要求实施,只是一个界面。所以不要担心实施。地图允许您为特定键(在您的情况下,一组字符)中放置一个值(在您的情况下,一组有序的字符串),并使用相同的键来检索相同的值。那个界面会是什么样的?这是个问题。

答案 1 :(得分:1)

“非静态变量名称无法从静态上下文中引用”很容易解决。

您可以删除methodB()的“静态”修饰符。

另一个解决方案是将您的类成员“names”声明为static。

你的方法方法ASet()有一个bug !!!您将name1,name2和name3重新声明为 local 变量。因此,永远不会设置静态类成员。

TreeSet和TreeMap具有不同的功能:

  • TreeMap是一个Map(inteface java.util.Map),也就是说一个关联键/值(其中键是有序的)
  • TreeSet是一个Set(接口java.util.Set):一个有序的对象集合,其中所有对象在集合中都是唯一的,没有Map的“关键”概念。

因此,您必须选择与您的需求相关的表示(Map或Set)(通过键访问对象)。

答案 2 :(得分:1)

看起来私有TreeMap名称不是静态的,因此无法从静态方法访问它。也许你需要了解静态变量/方法? http://leepoint.net/notes-java/flow/methods/50static-methods.html

你必须记住methodASet和methodB是不同的方法,methodBet中的变量不能被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

答案 3 :(得分:0)

这是一种旁观,因为它看起来像你的指令实际上要你创建一个接口,而不是一个实现。但是,鉴于实现此接口的任务,如果一直使用Java术语(map,set,character和string),说明似乎要求您维护此数据结构:

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

如果是这种情况,TreeMap不是一个很好的实现选择,因为很难在非排序集上强制执行排序。 Set没有为初学者实现Comparable,为TreeMap创建Comparator需要一些复杂的逻辑。

如果以上是教师的期望,我建议使用HashMap,使用Set作为密钥类型没有问题:

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