为 for 循环中的每个对象创建 Multimap
Posted
技术标签:
【中文标题】为 for 循环中的每个对象创建 Multimap【英文标题】:Create Multimap for every single object in for-Loop 【发布时间】:2013-09-02 11:57:01 【问题描述】:出了点小问题,理论上我什至知道如何解决,但实际上无法解决。
我得到了这段代码:
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。就像在代码示例中一样,我想要的不是 mm,而是 attributeNameTop 的值。
我希望这个编辑可以让我更清楚我想要做什么。
编辑2: 我的 Inputfile 看起来像这样,当然有更多的行,想保持简单。每一行代表我的类图中的一个类,以及它的属性和值。我想为每个类创建一个对象并将其保存在某个地方以供在项目中进一步使用。当我遍历 Inputfile 时,我将 AttributeTopName1 作为第一个类,然后应该创建一个具有相同名称的新对象,以及我通过下一个循环获得的属性。我测试过,输入文件格式正确,解析可以完成这个任务。
<Model>
<Package>
<AttributeTopName1 Attribute1=AttributeValue1 Attr2=AttributeValue2 />
<AttributeTopName2 Attribute1=AttributeValue1 Attr2=AttributeValue2 />
</Package>
</Model>
【问题讨论】:
请根据@disrvptor 的cmets 改进您的问题 已编辑问题,希望现在更清楚。 【参考方案1】:很遗憾,下面这句话没有多大意义。
该文件包含几个对象,我在第一个循环(attributeTop)中遍历它们,我想为第一个 for 循环中的每个计数创建一个自己的 Multimap。
正如前面的评论所说,MultiMapper 应该在 for 循环之外声明。您的代码对以下值没有任何作用
attributeTopName 多也许您应该提供更多的 main 方法,因为它似乎完全不会影响循环中的数据。另外,我们是否理解 main 方法是 MultiMapper 类的一部分?
最后,你真的不应该重载方法名main。它应该保留给实际的 main 方法。
【讨论】:
感谢您的评论。我编辑了这个问题。如果您仔细查看,将不胜感激。 Andy 的回答是正确的,您将创建一个 String 到 MultiMap (Map我猜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");
【讨论】:
感谢您的努力。您的回答使我走上了正轨,但是您的代码中有一些小错误。不过,我不明白,listOfElements 是什么?你没有在任何地方声明。我知道您正在遍历所有元素,但是如何,而不在任何地方声明呢? 在您的代码中,您通过调用attributeTop.getChildren() 来检索一些数组或Iterable。我不确定它来自哪里、对象的类型或函数的返回类型,所以我只是将它重命名为 listOfElements 以明确我猜测它是一个 List以上是关于为 for 循环中的每个对象创建 Multimap的主要内容,如果未能解决你的问题,请参考以下文章
JAVASCRIPT / REACT:为 for 循环中的每个元素返回 HTML
for...of语句在可迭代对象(包括 Array,Map,Set,String,TypedArray,arguments 对象等等)上创建一个迭代循环,调用自定义迭代钩子,并为每个不同属性的值执行语