0

我是 Java 的初学者,我正在尝试使用类在 Java 中实现类似数据结构的结构,我想在其中寻找匹配项......这个问题之前可能已经被问过,但我找不到它。请帮忙。代码如下:

public class operations extends DefFunctionHandler {  

public Integer stream;  
public Integer funct;  
public String name;  
public Integer funcgroup;  
public Integer source;  
}  
 //in another class
 public void execute(String x) {  

 List<operations> oplist = new ArrayList<operations>();  
 operations op = new operations();  

 for(int i=0; i< functi.size();i++){  
     op.stream = str.get(i);  
     op.funct = functi.get(i);  
     op.funcgroup = functigroup.get(i);  
     op.name = nme.get(i);  
     op.source = src.get(i);  

}  

 oplist.add(op);
 Map<String, List<operations>> map = new HashMap<String, List<operations>>();

 map.put(x, oplist);
 List<operations> ope = map.get(x);
 for (Map.Entry<String, List<operations>> entry : map.entrySet()) {
      String key = entry.getKey();
      List<operations> value = entry.getValue();
      System.out.println(value);
    } 

} 

如所见,我有一个班级operations,其中有不同的领域。在另一个名为 的方法execute中,我以数组的形式将值添加到这些字段中。现在我从用户那里得到一个输入name,我想在类/结构实现中搜索它并将流的相应值返回给用户。我知道我必须实现一个 Map 接口,但我该怎么做呢?当我尝试打印value时,我得到otf.operations@3934f69aMap Interface 的实现和 get 方法是否正确?我很困惑。请帮忙。

编辑execute方法的代码现在看起来像这样

 public void execute(String x) {

    Map<String,Operations> obs = new HashMap<String,Operations>();  

    for(int i=0; i< functi.size();i++){
        Operations op = new Operations();
        op.stream = str.get(i);
        op.funct = functi.get(i);
        op.funcgroup = functigroup.get(i);
        op.name = nme.get(i);
        op.source = src.get(i);

        obs.put(op.name, op);       

}
    System.out.println(obs.get(x));

}
4

4 回答 4

1

您正在尝试打印列表:

System.out.println(value)

其中值是 a List<operations>。您想要做的是打印该列表的值。然后执行以下操作:

for (operations o : value) {
    System.out.println(o.stream);
    System.out.println(o.name);
}

编辑您需要的代码:

public void execute(String x) {


      ArrayList<operations> ops= new ArrayList<operations>();
      for(int i=0; i< functi.size();i++) {
         operations op = new operations();
         op.stream = str.get(i);
         op.funct = functi.get(i);
         op.funcgroup = functigroup.get(i);
         op.name = nme.get(i);
         op.source = src.get(i);
         ops.add(op);
      }


     Map<String,ArrayList<operations>> map = new HashMap<String, ArrayList<operations>>();
     map.put(x, ops);

     for (operations operation : map.get(x)) {
         System.out.println(operation.name);
     }

}
于 2013-06-12T09:43:53.363 回答
1

首先valueList<Operations>,所以要遍历每个,你可以做

for(Operations o : value) {
   System.out.println(o);
}

如果您有机会看到 的实现System.out.printlin(object),它将打印object.toString()

默认情况下从类继承otf.operations@3934f69a的方法返回的字符串也是如此 (因为所有类都隐式扩展)。的看起来像这样toString()java.lang.ObjectObjecttoString()java.lang.Object

public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

要更改此行为,在您的操作类中,您需要覆盖 toString() 方法

class Operations {

  @Overrides
  public String toString() {
     return name;
  }

}
于 2013-06-12T09:46:30.310 回答
1

地图可以被认为是每个项目都带有标签的列表,因此您可以通过标签轻松找到列表中的项目。标签是什么?好吧,在 Java 的上下文中,它被称为键,并且可以是多种类型。大多数时候它是一个字符串,但它也可以是任何正确实现的对象equals(Object obj)hashCode()字符串已经做到了)。

让我们看看如何将对象插入列表:

List<operations> list = new ArrayList<operations>();
for(int i=0; i functi.size(); i++) {
  operations op = new operations();
  op.stream = str.get(i);  
  op.funct = functi.get(i);  
  op.funcgroup = functigroup.get(i);  
  op.name = nme.get(i);  
  op.source = src.get(i);

  list.add(op);   
}

请注意,在循环内部,我调用 newoperations然后将其添加到列表中。这是因为我想为我可以创建的每个潜在操作 创建一个新实例operations并将其添加到列表中。

如果我使用相同的实例会发生什么?我会一次又一次地用不同的值设置它的成员,并将同一个实例插入到列表中(是的,一个列表可以多次包含同一个实例)。看起来你插入了一个列表,其中包含operations所有具有相同值的列表(恰好与最后一个操作一致)。这是因为当您设置实例的属性时,对同一实例的所有引用也会更改(想想指针)。因此,换句话说,请确保每次都创建一个新实例(您不必担心以后删除它。这会自动完成)。

为了使用地图,您只需稍微更改逻辑即可。您使用 put 而不是调用 add,而且您必须提供它的密钥。当您以后需要它时,您必须提供它的密钥而不是它的编号。以下是将其添加到地图的方法:

Map<String, operations> map = new HashMap<String, operations>();
for(int i=0; i functi.size(); i++) {
  operations op = new operations();
  op.stream = str.get(i);  
  op.funct = functi.get(i);  
  op.funcgroup = functigroup.get(i);  
  op.name = nme.get(i);  
  op.source = src.get(i);

  map.put(op.name, op);   
}

稍后,要检索一个值,我只需要做map.get("juggling"),如果它存在于地图中,它会给我那个特定的实例operations,否则它会给我null.

您应该在这里注意几件事:

  • 这样,重复名称的操作就会被覆盖。如果您没有重复项,则没有问题。否则,您可以考虑使您的键更具体或使您的地图包含一个List实例operations(在第一次放置该键时,您必须创建列表实例并将其添加到地图中)。
  • 如果您仅使用其密钥进行访问,则此方法是理想的。如果您还想以列表的形式访问它,您应该更喜欢LinkedHashMap而不是HashMap(除非您认为两者都需要,否则不要使用,因为它稍微贵一些,但它保持插入顺序)。

此外,还有一些最佳实践说明:

  • 考虑将 setter 和 getter 添加到operations. 在这个特定的程序中它可能对您没有帮助,但它是最佳实践,并且毫无疑问会在其他程序中帮助您。
  • Java 类名通常以大写字母开头。方法名和成员名都是驼峰式的。
  • 您通常不会将 Java 类名设为“复数”,除非它是某种容器。换句话说,我希望调用一个操作,并调用一个实例Operation列表。OperationOperations

希望有帮助!

于 2013-06-13T08:10:57.510 回答
0

一些忠告:

正如您将其命名为“struct”,我猜您来自 C。在 Java 中,您只需创建一个“bean”,它是一个只有 getter 和 setter 的对象(属性通常被声明为私有,因此您需要一个 getX () 和 setX(value) 方法来访问和修改它们)。那或多或少是您的“操作”课程。

类名总是以大写字母开头(Java 约定)。

如果您需要通过值快速查找 bean/struct,则将其存储在 Map 中:

Map<String, operations> map = new HashMap<String, operations>();
map.put(myOperation.getName(),myOperation);

然后,您只需编写即可获得该beanmap.get(name).

toString()最后一件事,你必须在你想轻松编写的任何对象中实现该方法

编辑:我认为您不需要列表,只需将每个元素直接放入地图并删除列表,例如:

Map<String,operations> oplist = new HashMap<String,Operations>();  
 operations op = new operations();  

 for(int i=0; i< functi.size();i++){  
     op.stream = str.get(i);  
     op.funct = functi.get(i);  
     op.funcgroup = functigroup.get(i);  
     op.name = nme.get(i);  
     op.source = src.get(i);
     oplist.put(op.name,op);  //You forgot this! it must be in the loop

}  

然后你可以通过名称找到任何操作(我假设名称是唯一的)

于 2013-06-12T10:01:34.473 回答