如何计算字符串出现的次数

时间:2018-07-30 15:26:04

标签: java error-handling counter

因此,我为我的代码创建了一条错误消息。当前,我的代码每次出现时都会弹出错误消息。我的代码验证并确保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>());

3 个答案:

答案 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>());