首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 陣列元素出現次數統計與字串大小比較工具方法實作

     編輯:Java 相關知識

工具一:陣列元素眾數統計(已知最大值優化)

適用於非負整數陣列且已知最大值的場景,利用計數陣列(Counting Sort 思想)實現 O(n) 時間、O(max) 空間統計。

實作代碼

import java.util.*;

public class ArrayStats {

    /**
     * 找出陣列中出現次數最多的元素及其次數
     * @param array 目標陣列(非負整數)
     * @param maxVal 陣列中可能的最大值(用於分配計數陣列大小)
     * @return Map: "value"->眾數, "maxCount"->出現次數
     */
    public static Map<String, Integer> findMode(int[] array, int maxVal) {
        Map<String, Integer> result = new HashMap<>();
        result.put("value", 0);
        result.put("maxCount", 0);

        if (array == null || array.length == 0 || maxVal < 0) return result;

        try {
            int[] counter = new int[maxVal + 1];
            for (int v : array) {
                if (v >= 0 && v <= maxVal) counter[v]++;
            }

            int mode = 0, maxCount = 0;
            for (int i = 0; i <= maxVal; i++) {
                if (counter[i] > maxCount) {
                    maxCount = counter[i];
                    mode = i;
                }
            }
            result.put("value", mode);
            result.put("maxCount", maxCount);
        } catch (Exception ignored) {}
        return result;
    }
}

使用範例

int[] data = {3, 5, 2, 3, 8, 3, 5, 9, 3};
Map<String, Integer> r = ArrayStats.findMode(data, 9);
System.out.println("眾數: " + r.get("value") + ", 次數: " + r.get("maxCount"));
// 輸出: 眾數: 3, 次數: 4

限制與替代方案


工具二:字串大小比較(自定義排序規則)

模擬資料庫 ORDER BY 語義:null 視為空串,空串最大,其餘按 ASCII 碼累加和比較,相等則長度長者大。

實作代碼

public class StringComparator {

    /**
     * 比較兩字串大小
     * @return 負數: first < second; 0: 相等; 正數: first > second
     */
    public static int compare(String first, String second) {
        // null 轉空串
        first = first == null ? "" : first;
        second = second == null ? "" : second;

        int len1 = first.length(), len2 = second.length();

        // 空串特殊處理:空串最大
        if (len1 == 0 || len2 == 0) {
            return len2 - len1; // 誰長(非空)誰小 -> 空串較大
        }

        int sum1 = 0, sum2 = 0;
        int minLen = Math.min(len1, len2);

        // 逐字元累加 ASCII/Unicode 碼值
        for (int i = 0; i < minLen; i++) {
            sum1 += first.charAt(i);
            sum2 += second.charAt(i);
            if (sum1 != sum2) break; // 提前結束
        }

        if (sum1 == sum2) {
            return len1 - len2; // 碼值和相等,長者大
        }
        return sum1 - sum2; // 碼值和大者大
    }
}

測試案例

System.out.println(StringComparator.compare("abc", "abd")); // 負數 (abc < abd)
System.out.println(StringComparator.compare("", "a"));      // 正數 (空串 > "a")
System.out.println(StringComparator.compare(null, "x"));    // 正數 (null 視為空串 > "x")
System.out.println(StringComparator.compare("aa", "a"));    // 正數 (長度較長)
System.out.println(StringComparator.compare("a", "a"));     // 0

注意事項

  • 此比較器非標準字典序,不可直接用於 Collections.sort(違反傳遞性可能導致異常)。
  • 標準字典序請用 String.compareTo() 或 Comparator.naturalOrder()。
  • 若需資料庫一致排序,請在 SQL ORDER BY 層面解決,不要在 Java 端模擬。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
限制替代方案
需知最大值、且最大值不能過大(記憶體)改用 Map<Integer, Long> 計數,空間 O(不同值數)
不支援負數偏移量處理:counter[v + offset]++
多個眾數僅回傳第一個回傳 List<Integer> 所有最大計數值