本人在測試抽獎活動的過程當中,遇到一個需求,須要統計每一次抽獎結果,而後跟預期值比較。一開始的思路是沒遇到一次而後設立一個int 類型的參數,而後遇到了就++一次就好了,可是狀況比較多,用 switch-case 來作比較麻煩,須要寫很長的代碼,聯想到以前面試也遇到過相似的問題,因此特地寫了一個方法來作這個事情。思路是利用 jsonobject 類的 containKey 方法來實現的。若是存在就 value 值加一,若是不存在就 put 到 jsonobject 裏面。下面是代碼,供各位參考。java
package com.fun.utils import com.fun.frame.SourceCode import net.sf.json.JSONObject import java.util.stream.Collectors /** * 統計出現次數相關類 */ class CountTool extends SourceCode { /** * 統計數據出現的次數 * * @param counts 統計的 jsonobject 對象 * @param object 須要統計的數據 */ static def count(JSONObject counts, Object object) { count(counts, object, 1) } /** * 統計數據出現的次數 * * @param counts 統計的 jsonobject 對象 * @param object 須要統計的數據 * @param num 默認值 */ static def count(JSONObject counts, Object object, int num) { counts.put(object, Integer.valueOf(counts.getOrDefault(object.toString(), num))) } /** * 統計某個list裏面某個元素出現的次數 * @param list * @param str * @return */ static def count(List list, def str) { list.count { s -> s.toString().equals(str.toString()) } } /** * 統計某個list裏面各個元素出現的次數 * collect,是一個map<object,list>對象 * @param list * @return */ static def count(List list) { def collect = list.stream().collect(Collectors.groupingBy { x -> x.toString() }) collect.keySet().stream().sorted().forEach { x -> output("元素:${x},次數:${collect.get(x).size()}") } } }
中間用到了 tostring 方法,也就是隻能針對基礎變量類型和 string,其餘的 tostring 出來多是 hash 值,使用還須要分狀況,能夠重載一下。面試