0

遇到了一个小问题,我什至知道如何在理论上解决它,但实际上无法让它运行。

我得到了这段代码:

Multimap<String, String> mm = HashMultimap.create();

public MultiMapper(String AttributeName, String AttributeValue)
 {

   mm.put(AttributeName, AttributeValue); }

从这里调用它:

for(Element attributeFirst : attributeTop.getChildren()) {
    String attributeTopName = attributeTop.getName().toString();
    MultiMapper m = new MultiMapper();
    for(Attribute attributeSecond: attributeFirst.getAttributes()){
       String AttributeName = attributeSecond.getName().toString();
       String AttributeValue = attributeSecond.getValue().toString();
       m.MultiMapper(AttributeName, AttributeValue);
    }
 }

XML 文件:

编辑: main-Method(我更改了它的名称)的唯一目的是创建一个新的 Multimap 并用值填充其字段。例如:第一个 for 循环有 5 个元素,所以我想生成 5 个不同的 Multimap,这是我现在最关心的问题,无法得到它。第二个 for 循环包含映射的值,这些值通过 main 方法中的 put 放入映射中。

困扰我的第二个问题:attributeTopName 是父节点的名称,我想故意这样命名 Map。但是你不能将Datatype String映射到Multimap。那么我怎样才能把这个Attribute作为一种键放入映射中,这样当我想引用那个列表时,我使用attributeNameTop值来获取Multimap。就像在 Codeexample 中一样,我想要的不是 mm,而是 attributeNameTop 的值。

我希望这个编辑可以让我更清楚我想要做什么。

Edit2:我的 Inputfile 看起来像这样,当然有更多的行,想保持简单。每一行代表我的类图中的一个类,以及它的属性和值。我想为每个类创建一个对象并将其保存在某个地方以供在项目中进一步使用。当我遍历 Inputfile 时,我将 AttributeTopName1 作为第一个类,然后应该创建一个具有相同名称的新对象,以及我通过下一个循环获得的属性。我测试了它,输入文件是正确的格式,解析对于这个任务来说是可以的。

<Model>
  <Package>
     <AttributeTopName1 Attribute1=AttributeValue1 Attr2=AttributeValue2 />
     <AttributeTopName2 Attribute1=AttributeValue1 Attr2=AttributeValue2 />
  </Package>
</Model>
4

2 回答 2

1

我猜这Element看起来像这样:

class Element {
    private final String name;
    private final List<Attribute> attributes;
    Element(String name, List<Attribute>) {this.name = name; this.attributes = attributes;}
    String String getName() { return name; }
    String List<Attribute> getAttributes() { return attributes; }
}

看起来Attribute

class Attribute {
    private final String key;
    private final String value;
    Attribute (String key, String value) {this.key = key; this.value = value;}
    String getKey(){return key;}
    String getValue(){return value;}
}

因此,您迭代的数据结构是对列表的列表:

[Element1Name:[[Attr1Key, Attr1Val], [Attr2Key, Attr2Value]],
 Element2Name:[[Attr3Key, Attr3Val],
 ...]

到目前为止我是对的吗?

在您的问题中,您说您想为每个元素创建一个单独的 MultiMap。如果我们将每个 MultiMap 存储在 Map 中,它看起来像:

Map<String, Multimap<String, String>> multimaps = new HashMap<String, Multimap<String, String>>();
for(Element element : listOfElements) {
    String elementName = element.getName();
    MultiMap<String, String> mm = new HashMultimap.create();
    for(Attribute attribute: element.getAttributes()){
       String attributeName = attribute.getName();
       String attributeValue = attribute.getValue();
       mm.put(attributeName, attributeValue);
    }
    multimaps.put(elementName, mm);
}

现在我们可以通过调用来检索所需的 Multimap:

Multimap<String, String> mm = multimaps.get("ElementName");
于 2013-09-04T13:33:49.260 回答
1

不幸的是,下面的句子没有多大意义。

该文件包含几个对象,我在第一个循环(attributeTop)中迭代它们,我想为第一个 for 循环中的每个计数创建一个自己的 Multimap。

正如前面的评论所说,MultiMapper应该在 for 循环之外声明。您的代码对以下值没有任何作用

  • 属性TopName

也许您应该提供更多的main方法,因为它似乎完全不会影响循环中的数据。另外,我们是否理解main方法是MultiMapper类的一部分?

最后,你真的不应该重载方法名main。它应该保留给实际的主要方法。

于 2013-09-02T13:35:22.103 回答