【问题标题】:Java - coupling String and storing in arrayJava - 耦合字符串并存储在数组中
【发布时间】:2017-03-09 20:47:36
【问题描述】:

我正在尝试将用户的输入作为字符串hex 并将其分成几对;然后我想将每对夫妇存储在一个数组中hexArray。换句话说,我想在每两个字符处拆分字符串。我正在考虑可能在每两个字符处插入一个- 并使用String.split() 来拆分它,但这是我设计的方法。在这种情况下,将用户对hex 的输入设为"1234567"。这是我目前所拥有的:

    //removes last character from hex if length is odd and stores it back in hex
    hex = hex.length() % 2 == 0 ? hex : hex.substring(0, hex.length() - 1);

    String [] hexArray = new String[hex.length()/2];

    //initializes and prints the first element of the array as the first two chars
    //of hex
    System.out.println(hexArray[0] = hex.substring(0, 2));
    for (int i = 1; i + 3 < hex.length(); i++)
    {     
        System.out.println(hexArray[i] = hex.substring(i + 1, i + 3));

    }

这个输出是

12
34
45

我已经以我能想到的各种方式更改了 for 循环中的终止语句。如果编译正确,它会输出

12
34
56

我启动数组的第一个元素只是为了避免i = 0 的情况。我怎样才能避免这种重叠?另外,有没有办法将hexArray的每个元素从十六进制转换为十进制形式(假设hex的字符由输入0-9和AF(不区分大小写)组成),然后连接hexArray的元素成一个字符串? TIA。

【问题讨论】:

  • 你能具体说明你的输入和预期输出吗?
  • 如果我输入 1234567,预期输出将是 12 34 56 全部存储在一个数组中
  • 这背后的原因是什么?因为十六进制的输入是 12D687,还是只是间隔每两个字符?
  • 这是针对我正在开发的程序的,但我只是停留在将hex 拆分为每 2 个字符并将每个拆分部分存储到数组中 hexArray

标签: java arrays string split


【解决方案1】:

显然假设字符串长度可以是偶数或奇数,您必须首先处理这种情况。在十六进制开头附加 0 不会造成任何伤害,填充问题,像这样解决它

    String str = "123";
    String hex = "";
    while( ( str.length() % 2 ) != 0 )
    {
        str = "0" + str;
    }

一旦你处理了这个,你就可以将整个事情编译为

    String str = "123";
    String hex = "";
    while( ( str.length() % 2 ) != 0 )
    {
        str = "0" + str;
    }
    System.out.println( str );
    for( int x = 0; x < str.length(); x++ )
    {
        hex += str.charAt(x);
        if( ( (x + 1) % 2) == 0 )
        {
            hex += '-';
        }
    }
    if( hex.endsWith("-") )
    {
        hex = hex.substring( 0 , hex.length() - 1);
    }
    System.out.println( hex );
    String[] hexArray = hex.split("-");
    System.out.println( java.util.Arrays.toString(hexArray) );

因此,在循环内部,在每一次迭代中,我们都会在字符串中附加一个“-”。但由于这可能会在字符串末尾留下不需要的“-”,我们只需确保使用 hex = hex.substring( 0 , hex.length() - 1); 删除这种情况> 这将为您提供您想要的字符串。 if( ( (x + 1) % 2) == 0 ) 只是确保我们没有测试 is (0 % 2) == 0? p>

最后为了生成一个包含每一对的数组,你可以这样做

    String[] hexArray = hex.split("-");
    System.out.println( java.util.Arrays.toString(hexArray) );

希望对你的案子有帮助??

【讨论】:

    【解决方案2】:

    你可以使用正则表达式来分割每两个字符

    String str = "1234567";
    // if the string length is not even we remove the last char.
    str = (str.length()%2==0)?str: str.substring(0, str.length()-1);
    // this regex matches every two chars, so it will split every two chars
    String[] split = str.split("(?<=\\G..)");
    for(String s: split){
     System.out.println(s); // prints 12 34 56
    }
    

    【讨论】:

    • 你真的用正则表达式现象解决了它:),但是******7 case呢?哦,是的,我只是忘记了,他希望将其删除 :D 。不过真的很好的答案
    【解决方案3】:

    下一个方法改变你的 for 循环:

        for (int i = 0; i * 2 + 2 <= hex.length(); i++)
        {
            System.out.println(hexArray[i] = hex.substring(i * 2, i * 2 + 2));
    
        }
    

    i = 0不需要特殊处理。

    它背后的逻辑是你的数组位置应该是当前字符串位置的一半。你也可以做这种比较i * 2 + 2 &lt;= hex.length() 因为子字符串的上限不包括在内。

    【讨论】:

    • 非常感谢。这正是我一直在寻找的。我似乎无法弄清楚i 所涉及的算术 - 我尝试了很多组合
    猜你喜欢
    • 2012-12-01
    • 2017-04-08
    • 2012-02-28
    • 1970-01-01
    • 1970-01-01
    • 2017-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多