为for-Loop中的每个对象创建Multimap

时间:2013-09-02 11:57:01

标签: java hashmap guava multimap

遇到了一个小问题,我甚至知道如何在理论上修复它,但实际上无法实现它。

我得到了这段代码:

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-loop有5个Elements,所以我想生成5个不同的Multimaps,这是我现在最关心的问题,无法得到它。第二个for循环包含地图的值,这些值通过放入main方法放入地图中。

困扰我的第二个问题:attributeTopName是父节点的名称,我想故意将Map命名为。但是你不能将数据类型字符串映射到Multimap。所以我如何将这个属性作为一种键放入地图中,这样当我想引用该列表时,我使用attributeNameTop值来获取Multimap。就像在Codeexample中一样,而不是mm我想要attributeNameTop的值。

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

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

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

2 个答案:

答案 0 :(得分:1)

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

  

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

正如之前的评论所述, MultiMapper 应该在for循环之外声明。您的代码不会对以下值执行任何操作

  • attributeTopName

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

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

答案 1 :(得分: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");