hashMap正在更新中其他对象的值,同时更新所需的值

kognpnkq  于 2021-07-11  发布在  Java
关注(0)|答案(2)|浏览(248)

我有一个列表如下,我想按客户号码在hashmap排序。名单上有两个客户的信息。
list[bookrecord[clientnumber=1,columnnames=[name],data=[ def]],bookrecord[clientnumber=2,columnnames=[name],data=[ghi gkl]],bookrecord[clientnumber=1,columnnames=[address],data=[1213]],bookrecord[clientnumber=2,columnnames=[address],data=[456]]
我正在用下面的代码尝试这个。

public static Map<String, BookRecord> process(List<BookRecord> bookRecords) {
        Map<String, BookRecord> processedMap = new HashMap<String, BookRecord>();
        for (BookRecord bookRecord : bookRecords) {
            BookRecord existingBook = processedMap.get(bookRecord.getClientNumber());

            if(existingBook != null) {
                existingBook.addRecords(bookRecord);
            } else {
                processedMap.put(bookRecord.getClientNumber(), bookRecord);
            }
        }

        return processedMap;
    }

一旦现有的book不是空的,并且我向现有的book添加了值,我就可以看到列名也被添加到另一个记录(client2)中。列名和数据的创建方式相同。下面是我添加记录的代码

public void addRecords(BookRecord bookRecord) {
        if ( this.columnNames.isEmpty()) {
            this.columnNames = new ArrayList<>();
        }
        this.columnNames.addAll(bookRecord.getColumnNames());
        if ( this.data.isEmpty()) {
            this.data = new ArrayList<>();
        }
        this.data.addAll(bookRecord.getData());

    }

我不能忽略重复的值,因为可能存在我不应该忽略的重复值。
由于列名被添加了两次,最后的答案如下{1=bookrecord[clientnumber=1,columnnames=[name,address,address],data=[ def,1213]],2=bookrecord[clientnumber=2,columnnames=[name,address,address],data=[ghi gkl,456]}
当我在另一台电脑上尝试时,地址是先读的,所以名字是重复的。我试图处理该值并将其删除,但一旦我更新第二条记录就会被更新。需要-->{1=bookrecord[clientnumber=1,columnnames=[name,address],data=[ def,1213]],2=bookrecord[clientnumber=2,columnnames=[name,address],data=[ghi gkl,456]}请帮助我

wmtdaxz3

wmtdaxz31#

我的答案需要Java8或更高版本。你的 BookRecord 班级:

public class BookRecord {

    private String clientNumber;
    private List<String> columnNames;
    private List<String> data;

    // getters, setters and all that stuff

    public static BookRecord mergeBookRecordData(List<BookRecord> bookRecords) {
        return bookRecords.stream()
                .reduce((r1, r2) -> {
                    r1.getColumnNames().addAll(r2.getColumnNames());
                    r1.getData().addAll(r2.getData());
                    return r1;
                }).get();
    }
}

这种方法应该做到:

public List<BookRecord> orderByClientNumber(List<BookRecord> unordered) {

        // first group by client number
        Map<String, List<BookRecord>> groupedByClientNumber = unordered
                .stream()
                .collect(Collectors.groupingBy(BookRecord::getClientNumber));

        // merge data
        List<BookRecord> orderedRecords = groupedByClientNumber
                .values()
                .stream()
                .map(BookRecord::mergeBookRecordData)
                .collect(Collectors.toList());

        return orderedRecords;
    }
pftdvrlh

pftdvrlh2#

我发现了问题。问题不在于这段代码,而是我生成初始列表的地方。我正在读取一个文件的列,并将它们添加到一个文件的其余记录中。因此,两个columnname对象共享相同的id。我所要做的就是将新创建的列名 Package 到一个新的arraylist中,如->new arraylist<>(columnnames)

相关问题