因此,我为我的代码创建了一条错误消息。当前,我的代码每次出现时都会弹出错误消息。我的代码验证并确保Excel文件格式正确。验证后,它会返回错误/警告消息(如果发生)。因此,当我收到错误消息时,每条消息都会在每次发生时出现。例如,验证Excel文件时,会出现6次错误消息“错误,ID不能包含特殊字符”。有什么方法可以简单地写检查消息是否已经发生,并记下多少次以便我可以显示该消息?
我考虑过类似if (message = message) { //then create counter}
之类的事情,但由于消息始终等于消息,因此无法正常工作。有人有什么办法吗?
编辑:这是用于验证的代码的片段。我想将消息分组在一起,而在发布到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>());
答案 0 :(得分:1)
HashMap<String,Integer>
将使用String
的哈希码作为密钥,因此相同的String
将映射到地图中的相同位置。
因此,您可以在第一次看到消息字符串时(当它不在地图中时)将计数为1的消息字符串推入地图,然后再将其递增:
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 );
答案 1 :(得分:0)
使用HashMap<String, Long>
,其中键是错误消息,值是错误发生的次数。
收到错误消息时,请检查if map.containsKey(message)
,然后获取计数器(long counter = map.get(message)
),对其进行递增,然后将其放回地图(map.put(message, counter + 1L)
)中。
如果地图不包含该消息,则将其添加到地图中,并将计数器初始化为1(map.put(message, 1L)
)。
类似这样的东西:
private Map<String, Long> errors = new HashMap<String, Long>();
public void handleError(String error) {
if(errors.containsKey(error)) {
Long counter = errors.get(error);
errors.put(error, counter + 1L);
} else {
errors.put(error, 1L);
}
}
测试:
handleError("Error, id must not contain special characters");
handleError("StackOverflow");
handleError("Error, id must not contain special characters");
handleError("Error, id must not contain special characters");
handleError("StackOverflow");
for (Map.Entry<String, Long> entry : errors.entrySet()) {
System.out.println(entry.getKey() + " : " + entry.getValue());
}
输出:
StackOverflow : 2
Error, id must not contain special characters : 3
答案 2 :(得分:0)
只需在此处创建一个单独的答案,这样我就可以发布适用于该问题的完整代码。这是没有错误的代码:
// if there are errors, then
if (!errorResponse.getItems().isEmpty()) {
// set error response
Iterator<ErrorMessage> iter = errorResponse.getItems().iterator();
HashMap<String, Integer> messageCounts = new HashMap<String, Integer>();
errorResponse.getItems().forEach(ErrorMessage -> {
messageCounts.putIfAbsent(ErrorMessage.getMessage(), 1);
messageCounts.computeIfPresent(ErrorMessage.getMessage(), (k, v) -> v + 1);
});
Set<ErrorMessage> summaries = new HashSet<>();
for (String s : messageCounts.keySet()) {
ErrorMessage summary = new ErrorMessage();
summary.setMessage(s);
summary.setTotal(messageCounts.get(s));
summaries.add(summary);
}
errorResponse.setItems(summaries);
warningResponse.setItems(new ArrayList<WarningMessage>());