在说明书中,我被要求“声明一个接口类型来保存带有字符集作为其键的映射,并使用有序的字符串集作为值”。这段时间我一直在使用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
}
答案 0 :(得分:4)
正如R. Bemrose在评论中所说,你不会被要求实施,只是一个界面。所以不要担心实施。地图允许您为特定键(在您的情况下,一组字符)中放置一个值(在您的情况下,一组有序的字符串),并使用相同的键来检索相同的值。那个界面会是什么样的?这是个问题。
答案 1 :(得分:1)
“非静态变量名称无法从静态上下文中引用”很容易解决。
您可以删除methodB()的“静态”修饰符。
另一个解决方案是将您的类成员“names”声明为static。
你的方法方法ASet()有一个bug !!!您将name1,name2和name3重新声明为 local 变量。因此,永远不会设置静态类成员。
TreeSet和TreeMap具有不同的功能:
因此,您必须选择与您的需求相关的表示(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>>();