簡體   English   中英

如何計算字符串出現的次數

[英]How To Count The Number of Times a String Occurs

因此,我為代碼創建了一條錯誤消息。 當前,我的代碼每次出現時都會彈出錯誤消息。 我的代碼驗證並確保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的哈希碼作為鍵,因此相同的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 );

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

只需在此處創建一個單獨的答案,這樣我就可以發布適用於該問題的完整代碼。 這是沒有錯誤的代碼:

            // 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>());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM