为 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) 的映射。但是,我也同意不要自己滚动的评论。如果您不想使用 DOM 或 SAX 模型来解析 XML,那么请查看 Jackson 的 XML 绑定支持。我相信它会接收一个 XML 文件并自动为你生成一个树形结构。 我使用 DOM 来解析 XML 文件。【参考方案2】:

我猜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 实际上我得到了一个 XML 文件,我从中获取了我的信息。所以我得到的数据是一个字符串。实际上我得到了 3 个字符串: AttributeTopName = Element.Name;属性名,属性值。您的建议是将所有属性TopName 元素放在一个列表中? 不,我不建议这样做。我只是在写你的问题时回答你的问题。我没有意识到你正在解析 xml。您可能想要使用预先存在的 xml 解析器,而不是滚动您自己的。 如果您在问题中包含以下数据,我们可能会提供更多帮助:1. 为您提供了哪些数据 2. 您想用这些数据做什么。将数据摄取到数据结构中是达到目的的一种手段,但我不知道目的是什么,因此很难知道您是否走在正确的道路上。

以上是关于为 for 循环中的每个对象创建 Multimap的主要内容,如果未能解决你的问题,请参考以下文章

JAVASCRIPT / REACT:为 for 循环中的每个元素返回 HTML

for...of语句在可迭代对象(包括 Array,Map,Set,String,TypedArray,arguments 对象等等)上创建一个迭代循环,调用自定义迭代钩子,并为每个不同属性的值执行语

在 for 循环中递增 JavaScript 对象中的值

ArrayList、for 循环和 if 语句的问题 - 为列表中的每个项目打印行

如何限制for循环中的网络调用次数?

在 for 循环期间访问嵌套对象 VueJS