所以我为我的代码创建了一条错误消息。目前,我的代码每次出现时都会发出错误消息。我的代码验证并确保 Excel 文件格式正确。验证后,如果发生错误/警告消息,它会返回。因此,当我收到错误消息时,每条消息都会在每次发生时出现。例如,验证 Excel 文件时出现 6 次错误消息“错误,id 不得包含特殊字符”。有什么方法可以简单地编写来检查消息是否已经发生,并保留次数的计数器以便我可以显示它?
我想到了类似 if (message = message) {//then create counter}
的东西,但这不起作用,因为 message 总是等于 message。有没有人有办法做到这一点?
编辑:这是验证代码的片段。我想将消息分组在一起,并且在发布到 API 时不让它们重复。
// if there are errors, then
if (!errorResponse.getItems().isEmpty()) {
// set error response
Iterator<ErrorMessage> iter = errorResponse.getItems().iterator();
Set<ErrorMessage> summarizedErrorMessages = new HashSet<>();
while (iter.hasNext()) {
ErrorMessage sem = new ErrorMessage();
ErrorMessage em = iter.next();
if (!summarizedErrorMessages.contains(em)) {
sem.setMessage(em.getMessage());
sem.setTotal(1);
} else {
sem.setTotal(sem.getTotal() + 1);
}
summarizedErrorMessages.add(sem);
}
errorResponse.setItems(summarizedErrorMessages);
warningResponse.setItems(new ArrayList<WarningMessage>());
最佳答案
一个HashMap<String,Integer>
将使用String
的 key 的哈希码,因此相同 String
将映射到 map 中的相同位置。
因此,当您第一次看到它时(当它不在 map 中时),您可以将消息字符串推送到计数为 1 的 map 中,然后递增它:
HashMap<String,Integer> messageCounts = new HashMap<>();
messages.forEach( message -> {
messageCounts.putIfAbsent( message, 0 );
messageCounts.computeIfPresent( message, (k,v) -> v+1 );
});
因此,对于您的具体情况,可能是这样的:
// First map messages to counts
HashMap<String,Integer> messageCounts = new HashMap<>();
errorResponse.getItems().forEach( errorMessage -> {
messageCounts.putIfAbsent( errorMessage.getMessage(), 0 );
messageCounts.computeIfPresent( errorMessage.getMessage(), (k,v) -> v+1 );
});
// Then create the summary objects
List<ErrorMessages> summaries =
messageCounts.entrySet().stream().map( e -> {
ErrorMessage summary = new ErrorMessage();
summary.setMessage( e.getKey() );
summary.setTotal( e.getValue() );
return summary;
} ).collect( Collectors.toList() );
errorResponse.setItems( summaries );
关于java - 如何计算字符串出现的次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51597373/