有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

因此,我为我的代码创建了一条错误消息。目前,我的代码每次出现时都会弹出错误消息。我的代码验证并确保excel文件格式正确。验证后,如果出现错误/警告消息,它将返回这些消息。因此,当我收到错误消息时,每一条消息都会在每次发生时出现。例如,验证excel文件时,错误消息“error,id不得包含特殊字符”出现6次。有什么方法可以简单地写下来检查消息是否已经发生,并保留一个计数器来显示多少次

我考虑过类似于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) 个答案

  1. # 1 楼答案

    只是在这里创建一个单独的答案,这样我就可以发布这个问题的完整代码。以下是运行时没有出现错误的代码:

                // 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>());
    
  2. # 2 楼答案

    一个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 );
    
  3. # 3 楼答案

    使用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