0

XML とスキーマ ファイルが与えられました。私の目標は、XML からすべてのデータを (重複なしで) 出力し、このリストを生年月日順に並べることでした。現在、すべてのデータを (重複して) 印刷しましたが、次に何をすべきかわかりません。いろいろ試してみましたがだめでした。

4

3 に答える 3

1

HashSet同等性を判断する方法に依存し、基になるテキストは同じですが、個別のノードNode.equals()を追加しています。ドキュメントから:

このセットに (e==null ? e2==null : e.equals(e2)) となる要素 e2 が含まれていない場合、指定された要素 e をこのセットに追加します

から下にあるテキスト ( String)を抽出するNodeと、HashSet<String>一意性が正しく判断されます。

于 2013-03-14T11:07:27.577 に答える
0

単一ノードの詳細で Java Bean (POJO) を作成することをお勧めします。オーバーライドequals()hashcode()て同じにします。すべての Node データを Bean の List に格納します。次にLinkedHashSet、重複を削除するために使用します。実装Comparableまたは使用ComparatorCollections.sort()て、同じものを並べ替えます。


別のクラスで拡張またはカプセル化Nodeしてオーバーライドequals()hashcode()、同じクラスで。すべてのを新しいクラス インスタンスNodeの に格納します。List次にLinkedHashSet、重複を削除するために使用します。実装Comparableまたは使用ComparatorCollections.sort()て、同じものを並べ替えます。

于 2013-03-14T11:30:56.020 に答える
0

編集

投稿をもう一度読んだ後、重複も削除する必要があることに気付きました。

a を使用しTreeSetて不自然さを課し、生年月日で並べ替えることができます。名前、姓、生年月日が同じ人は同じ人だと思います。

最初に、ノードを実装するクラスでラップComparableし、所有するすべてのプロパティを取得します。Comparableがこのメソッドを使用して、TreeSet要素が異なるかどうか ( a.compareTo(b) != 0) とそれらの順序付け方法を決定するため、ラッパーを実装する必要があります。

public static final class NodeWrapper implements Comparable<NodeWrapper> {

    private static final SimpleDateFormat DOB_FORMAT = new SimpleDateFormat("yyyy-MM-dd");
    private final Element element;
    private final Date dob;
    private final String firstName;
    private final String surName;
    private final String sex;

    public NodeWrapper(final Node node) {
        this.element = (Element) node;
        try {
            this.dob = DOB_FORMAT.parse(initDateOfBirth());
        } catch (ParseException ex) {
            throw new RuntimeException("Failed to parse dob", ex);
        }
        this.firstName = initFirstName();
        this.surName = initSurnameName();
        this.sex = initSex();
    }

    private String initFirstName() {
        return getNodeValue("firstname");
    }

    private String initSurnameName() {
        return getNodeValue("surname");
    }

    private String initDateOfBirth() {
        return getNodeValue("dateofbirth");
    }

    private String initSex() {
        return getNodeValue("sex");
    }

    private String getNodeValue(final String name) {
        return element.getElementsByTagName(name).item(0).getTextContent();
    }

    public Node getNode() {
        return element;
    }

    Date getDob() {
        return dob;
    }

    public String getFirstName() {
        return firstName;
    }

    public String getSurName() {
        return surName;
    }

    public String getDateOfBirth() {
        return DOB_FORMAT.format(dob);
    }

    public String getSex() {
        return sex;
    }

    public int compareTo(NodeWrapper o) {
        int c;
        c = getDob().compareTo(o.getDob());
        if (c != 0) {
            return c;
        }
        c = getSurName().compareTo(o.getSurName());
        if (c != 0) {
            return c;
        }
        return getFirstName().compareTo(o.getFirstName());
    }

    @Override
    public int hashCode() {
        int hash = 5;
        hash = 47 * hash + (this.dob != null ? this.dob.hashCode() : 0);
        hash = 47 * hash + (this.firstName != null ? this.firstName.hashCode() : 0);
        hash = 47 * hash + (this.surName != null ? this.surName.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final NodeWrapper other = (NodeWrapper) obj;
        if (this.dob != other.dob && (this.dob == null || !this.dob.equals(other.dob))) {
            return false;
        }
        if ((this.firstName == null) ? (other.firstName != null) : !this.firstName.equals(other.firstName)) {
            return false;
        }
        if ((this.surName == null) ? (other.surName != null) : !this.surName.equals(other.surName)) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "FirstName: " + getFirstName() + ". Surname: " + getSurName() + ". DOB: " + getDateOfBirth() + ". Sex: " + getSex() + ".";
    }
}

したがって、生年月日、姓、名がすべて等しい場合、同一人物であると見なされ、0返されcompareToます。必要な方法も同様です。a.compareTo(b)==0a.equals(b)equalshashCode

コードでa を使用するTreeSetと、自動的にソートされ、一意性が保証されます。

final Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new File("file.xml"));

final Set<NodeWrapper> inimesteList = new TreeSet<NodeWrapper>();

final NodeList isa = doc.getElementsByTagName("isa");
for (int i = 0; i < isa.getLength(); i++) {
    inimesteList.add(new NodeWrapper(isa.item(i)));
}
final NodeList ema = doc.getElementsByTagName("ema");
for (int i = 0; i < ema.getLength(); i++) {
    inimesteList.add(new NodeWrapper(ema.item(i)));
}
final NodeList isik = doc.getElementsByTagName("isik");
for (int i = 0; i < isik.getLength(); i++) {
    inimesteList.add(new NodeWrapper(isik.item(i)));
}
System.out.println();
System.out.println("Total: " + inimesteList.size());

for (final NodeWrapper nw : inimesteList) {
    System.out.println(nw);
}

また、メソッドを追加し、toStringそれを使用してノードを出力しました。これにより、コードがよりきれいになります。

このDocumentアプローチは、JAXB よりも単純に見えますが、この種の退屈な作業に悩まされています。すでにスキーマがあるので、JAXB アンマーシャリングに移行することを強くお勧めxjcします。これにより、この種のものが何百倍も簡単になります。

于 2013-03-14T11:33:28.160 に答える