【问题标题】:Mapping char array 2 by 2 character映射 char 数组 2 x 2 字符
【发布时间】:2020-04-30 23:14:24
【问题描述】:

我有一个像 XXYYXYXYXZXZXXZXYXX 这样的字符数组,我想将它映射到 LinkedHashMap 两个两个字符,如下所示:

public LinkedHashMap<String, Integer> convert(char[] array) {

    LinkedHashMap<String, Integer> map = new LinkedHashMap<String, Integer>();

    int[] freq = new int[array.length];
    int i, j;

    for (i = 0; i < array.length; i+=2) {
        freq[i] = 1;
        for (j = i + 2; j < array.length; j+=2) {
            if (array[i] + array[i+1] == array[j] + array[j+1]) {
                freq[i]++;
                array[j] = '0'; //flag to check if it is already printed
                array[j+1] = '0'; //flag to check if it is already printed
            }
        }
    }

    for (i = 0; i < freq.length; i+=2) {
        if (array[i] + array[i+1] != ' ' && array[i] != '0') {                
            String dublex = ""+ array[i] + array[i+1];
            hmap.put(dublex, freq[i]);
        }
    }
    return hmap;
}

通常它应该输入以下值: XX: 2 年:1 XY: 3 XZ:3

但它分配了以下值: XX: 2 年:4 XY: 3 XZ:?不可用

我对以下几行和几点表示怀疑:

1) 我尝试对 count freq[] 变量使用另一个循环值,例如“k”,并尝试将其计数在 0-9 之间,因为 18 个元素是 9 个两个字符元素:我尝试这样做,但没有有意义并抛出异常。

2)“0”部分添加到值的末尾:我尝试添加单独的 0 值并单独检查,例如array[i] != '0' &amp;&amp; array[i+1] != '0'

那么,如何解决这个问题?

【问题讨论】:

    标签: java hashmap linkedhashmap


    【解决方案1】:
        public static LinkedHashMap<String, Integer> convert(char[] array) {
            LinkedHashMap<String, Integer> map = new LinkedHashMap<String, Integer>();
    
            for (int i = 0; i < array.length - 1; i += 2) {
                map.put(array[i] + "" + array[i + 1], map.getOrDefault(array[i] + "" + array[i + 1], 0) + 1);
            }
    
            return map;
        }
    
        public static void main(String[] args) {
            System.out.println(convert("XXYYXYXYXZXZXZXYXX".toCharArray()));
        }
    

    ,输出

    {XX=2, YY=1, XY=3, XZ=3}
    

    【讨论】:

    • 难以置信,只用了一半的代码行!非常感谢:)
    • 是的,很好的答案。您可以使用new String(array, i, 2) 而不是array[i] + "" + array[i + 1]。另外,for 循环条件只能是i &lt; array.length,但结果是一样的。
    • @SirRaffleBuffle 你能把它作为答案发布吗?通过这样做,这个问题和答案可以帮助更多的人;)在此先感谢。
    • @SirRaffleBuffle 我也试过你的方法,是的,它更干净,不会改变结果。如果您有其他建议,我很乐意听到。谢谢。
    【解决方案2】:

    这只是 sc0der 的 answer 的改写,应十六进制的要求发布。

    static Map<String, Integer> pairFreq(char[] array)
    {
        LinkedHashMap<String, Integer> map = new LinkedHashMap<>();
        for(int i=0; i<array.length; i+=2)
        {
            String key = new String(array, i, 2);
            map.put(key, 1 + map.getOrDefault(key, 0));
        }
        return map;
    }
    

    测试:

    String str = "XXYYXYXYXZXZXZXYXX";
    Map<String, Integer> map = pairFreq(str.toCharArray());
    for(String pair : map.keySet())
        System.out.println(pair + " : " + map.get(pair));
    

    输出:

    XX : 2
    YY : 1
    XY : 3
    XZ : 3
    

    【讨论】:

      猜你喜欢
      • 2017-01-01
      • 1970-01-01
      • 2021-10-27
      • 2020-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多