Java-将字符串(4个字符)转换为int并返回的乐趣

时间:2019-06-18 22:30:55

标签: java functional-programming

请不要问为什么,但是我必须将一个字符串(最多4个字符)存储在一个整数值(即4个字节)中。

首先,我写了这篇文章,并且有效:

String value = "AAA";
int sum = IntStream.range(0, value.length())
                   .limit(4)
                   .map(i -> value.charAt(i) << (i * 8))
                   .sum();

System.out.println(sum);

我无法想出可行的解决方案。

StringBuffer out = new StringBuffer();
while (sum > 0) {
    int ch = sum & 0xff;
    sum >>= 8;
    out.append((char) ch);
}

有任何想法以实用的方式写回(“ AAA”)的方法吗?

6 个答案:

答案 0 :(得分:3)

一种解决方案可能是:

StringBuilder out =
    IntStream.iterate(sum, s -> s > 0, s -> s >> 8)
             .mapToObj(s -> (char) (s & 0xff))
             .collect(StringBuilder::new, StringBuilder::append, StringBuilder::append);

System.out.println(out.toString());

注意:我使用了三个参数的IntStream.iterate重载,该重载从Java 9开始可用。

答案 1 :(得分:3)

使用流将其转换回String并不是最好的方法;您现有的while循环看起来更干净,而且性能可能更高。但是,有一个流解决方案。

String result = IntStream.range(0, 4)
        .map(i -> (value >>> 24 - (i * 8)) & 0xFF)
        .dropWhile(i -> i == 0)
        .mapToObj(v -> String.valueOf( (char) v))
        .collect(Collectors.joining());

这将生成一些字节索引,获取特定的字节值,将其映射到char,它们将它们重新连接回String。它还使用Java 9+ method dropWhile删除前导0值。

我已通过添加“ 24-”以首先抓住最高有效字节来纠正此问题,以产生正确的顺序。

如果value0x10101 * 65,则返回"AAA"。在value中,0x10101 * 65 + 1返回"AAB"

答案 2 :(得分:2)

它基本上是一个char [4],它先被转移到一个int然后再返回。实际上,我想这会起作用

public static String getStr(int encoded){
    return ((char)(encoded >> 24) + ((char)((encoded >> 16) 0xFF)
            + ((char)((encoded >> 8) & 0xFF) + ((char)((encoded) & 0xFF)
}

答案 3 :(得分:1)

这与您的非常相似,但也许会有所帮助

    String str = IntStream.iterate(sum, s -> s > 0, s -> s >> 8)
            .mapToObj(s -> String.valueOf((char)(s & 0xff)))
            .collect(Collectors.joining());

答案 4 :(得分:1)

感谢大家的贡献。我找到了另一种可与您分享的解决方案:

String str = IntStream.iterate(sum, s -> s >> 8)
                      .limit(4)
                      .filter(s -> s > 0)
                      .mapToObj(s -> String.valueOf((char) (s & 0xff)))
                      .collect(Collectors.joining());

答案 5 :(得分:1)

  • 创建了一个移位值字符串以求和。
  • 掩盖每个字符。
  • 转换为字符串。
  • 并与收藏家一起加入。
   String str = IntStream.of(0, 8, 16, 24)
            .mapToObj(i->(char)(sum>>i&0xff)+"")
             .collect(Collectors.joining());