0

1 つのリストの順序が他のリストの順序と異なる 2 つのリストがあります。リストに、両方のリストでキーの順序が異なるマップを追加しています。両方のリストの順序を同じにしたい。どうすればこれを実行できますか?

Map<Long, String> attfieldMap = null;
attfieldMap = view.getNameMap(form);

List<Field> auditMap = new ArrayList<Field>();
if (itemId != 0) {

    Item dom = getRecord();

    Map<FormField, Object> tempValues = dom.getValues();
    List<Field> oldValues = new ArrayList<Field>();

    for (Map.Entry<FormField, Object> values : tempValues
            .entrySet()) {
        Field oldFld = new Field();
        Form form = (Form) values.getKey();

        if (attfieldMap.get(form.getField().getId()) != null) {
            oldFld.setKey(attfieldMap.get(form.getField()
                    .getId()));
            oldFld.setValue(values.getValue());

            oldValues.add(oldFld);
        }
    }
}


for (Map.Entry<Long, String> attfieldEntry : attfieldMap.entrySet()) {
    // Mandates to declare within loop
    Field attributeFld = new Field;

    attributeFld.setKey(attfieldEntry.getValue());
    attributeFld.setValue(String.valueOf(attfieldEntry.getKey()));

    auditMap.add(attributeFld);
}

リストauditMapにはキーatt13,のマップがあり、キー ,att12のマップがあります。このリストはリストと同じ順序にする必要があります。これを注文するには?att14oldValuesatt12att13att14auditMap

回答によると、編集された以下のコード: ここではデータがコピーされ、並べ替えだけが必要ですが、リストのサイズが異なります.list1 には独自のデータが必要であり、list2 には同じデータが必要ですが、順序は維持する必要があります

List<Field> auditMap = new ArrayList<Field>();
            attfieldMap = View
                    .getFieldID(form);

            for (Map.Entry<Long, String> attfieldEntry : attfieldMap.entrySet()) {

                Field attributeFld = new Field();

                attributeFld.setKey(attfieldEntry.getValue());
                attributeFld.setValue(String.valueOf(attfieldEntry.getKey()));

                auditMap.add(attributeFld);
                attributeFld = null;
            }

            if (itemId != 0) {

                Item dom = getRecord(domainItem);

                Map<FormField, Object> tempValues = dom.getValues();
                List<Field> oldValues = new ArrayList<Field>();

                for (Map.Entry<FormField, Object> values : tempValues
                        .entrySet()) {
                    Field oldFld = new Field();
                    Form form = (Form) values.getKey();

                    if (attfieldMap.get(form.getField().getId()) != null) {
                        oldFld.setKey(attfieldMap.get(form.getField()
                                .getId()));
                        oldFld.setValue(values.getValue());

                        oldValues.add(oldFld);
                    }

                }
                final Map<Field, Integer> indices = new HashMap<Field, Integer>();
                for (int i = 0; i < oldValues.size(); i++) {
                    indices.put(oldValues.get(i), i);
                }
                Collections.sort(auditMap, new Comparator<Field>() {
                    public int compare(Field o1, Field o2) {
                        int index1 = indices.containsKey(o1) ? indices.get(o1)
                                : -1;
                        int index2 = indices.containsKey(o2) ? indices.get(o2)
                                : -1;
                        return index1 - index2;
                    }
                });
                for (int i = 0; i < oldValues.size(); i++) {
                    LOGGER.info("the new data is--" + oldValues.get(i).getKey());
                }
                for (int i = 0; i < auditMap.size(); i++) {
                    LOGGER.info("the new data is--" + auditMap.get(i).getKey());
                }

これは私の実際のコードです。データは順序付けされていません。auditMap のキーは 1,2,3,4 で、古い値は 1,3,2 です。ハプニング

4

2 に答える 2

3

そのコード スニペットの最後で、auditMap と oldValues の両方を同じ順序にすることだけが必要な場合は、Field オブジェクトの適切なコンパレータを使用して Collections.sort() メソッドを実行するだけです。

IFそうでない場合は、ブロックの後に、oldValues と同じサイズのフィールド配列である auditMapArray を作成します (これは必ずブロックの外側で宣言する必要があります) IF。要素を auditMap に挿入するたびに、oldValues でそのインデックスを見つけ (2 つのFieldオブジェクトが等しいかどうかを確認するための適切な equals メソッドの実装があると仮定します)、auditMapArray の同じ場所にも挿入し、最後に を使用して auditMap リストを取得しArrays.asList(auditMapArray)ます。

auditMap に存在する oldValues のすべての値が同じ順序になるようにコード スニペットを修正したバージョン。auditMap への追加要素は、最後に追加されます。

Map<Long, String> attfieldMap = null;
attfieldMap = view.getNameMap(form);

List<Field> oldValues = new ArrayList<Field>();
if (itemId != 0) {

    Item dom = getRecord();

    Map<FormField, Object> tempValues = dom.getValues();

    for (Map.Entry<FormField, Object> values : tempValues
            .entrySet()) {
        Field oldFld = new Field();
        Form form = (Form) values.getKey();

        if (attfieldMap.get(form.getField().getId()) != null) {
            oldFld.setKey(attfieldMap.get(form.getField()
                    .getId()));
            oldFld.setValue(values.getValue());

            oldValues.add(oldFld);
        }
    }
}

List<Field> otherFields = new ArrayList<Field>();
Field [] auditMapArray = new Field[oldValue.size()];
int index;
for (Map.Entry<Long, String> attfieldEntry : attfieldMap.entrySet()) {
    // Mandates to declare within loop
    Field attributeFld = new Field;

    attributeFld.setKey(attfieldEntry.getValue());
    attributeFld.setValue(String.valueOf(attfieldEntry.getKey()));

    index = oldValues.indexOf(attributeFld);
    if (index > 0) {
        auditMapArray[index] = attributeFld;
    }
    else
    {
        System.err.println(attributeFld + " not found in oldValues");
        otherFields.add(attributeFld);
    }
}

List<Field> auditMap = Arrays.asList(auditMapArray);
auditMap.addAll(otherFields);
于 2012-09-01T13:23:27.770 に答える
3

最初のリストの項目のインデックスをキーとして使用して、カスタム コンパレータを使用して 2 番目のリストを並べ替えることができます。このようなもの:

Collections.sort(list2, new Comparator() {
    public int compare(Object o1, Object o2) {
        return list1.indexOf(o1) - list1.indexOf(o2);
     }});

更新:indexOfリストがソートされていない場合は時間がかかる可能性があり、このメソッドは非常に頻繁に呼び出されるため、最初にオブジェクトのインデックスをマップに格納することをお勧めします。つまり、HashMap {item: list1.indexOf( item)} メソッドでこのマップを使用しますcompare

それをまとめて、例の名前を使用します。

final Map<Field, Integer> indices = new HashMap<Field, Integer>();
for (int i=0; i < oldValues.size(); i++) {
    indices.put(oldValues.get(i), i);
}
Collections.sort(auditMap, new Comparator<Field>() {
    public int compare(Field o1, Field o2) {
        int index1 = indices.containsKey(o1) ? indices.get(o1) : -1;
        int index2 = indices.containsKey(o2) ? indices.get(o2) : -1;
        return index1 - index2;
     }});
于 2012-09-01T13:43:58.790 に答える