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 つの異なるマルチマップを生成したいのですが、それが今の私の最大の関心事です。取得できません。2 番目の for ループには、マップの値が含まれています。これらの値は、main メソッドの put によってマップに入れられます。

気になる 2 番目の質問: attributeTopName は親ノードの名前であり、意図的に Map にそのような名前を付けたかったのです。しかし、Datatype String を Multimap にマップすることはできません。この Attribute を一種のキーとしてマップに入れるにはどうすればよいでしょうか。そのリストを参照したい場合は、attributeNameTop 値を使用して Multimap を取得します。コード例のように、mm の代わりに attributeNameTop の値が必要です。

この編集により、私が何をしようとしているのかが明確になることを願っています。

Edit2: 私の入力ファイルは次のようになります。すべての行は、クラス ダイアグラム内のクラスを表し、その属性と値を示します。すべてのクラスのオブジェクトを作成し、プロジェクトでさらに使用するためにどこかに保存したいと考えています。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 ループでカウントごとに独自のマルチマップを作成したいと考えています。

前のコメントにあるように、MultiMapperは for ループの外で宣言する必要があります。コードは次の値では何もしません

  • attributeTopName
  • マルチ

ループ内のデータに影響を与えるようなことは何もしていないように見えるため、おそらくmainメソッドをさらに提供する必要があります。また、メインメソッドがMultiMapperクラスの一部であることを理解する必要がありますか?

最後に、メソッド名mainをオーバーロードしないでください。実際のメインメソッド用に予約する必要があります。

于 2013-09-02T13:35:22.103 に答える