【问题标题】:Take a String and turn it into a 2d array Java取一个字符串并将其转换为二维数组 Java
【发布时间】:2017-03-02 03:01:58
【问题描述】:

我正在开发一个程序,我从用户那里获取输入,然后输入 24 长度 String,数字 0-5,每个数字在一行中重复 4 次。例如000011112222333344445555。当我为用户收集号码时,我意识到我无法将它们放在2d int array of [6][4] 中。这就是我想要的,所以我想做的是获取该字符串并将每个数字放入该数组中。所以它看起来像这样[[0,0,0,0],[1,1,1,1],[2,2,2,2],[3,3,3,3],[4,4,4,4],[5,5,5,5]]。我不确定如何将它们放入这样的数组中。我知道字符串是不可变的,所以我不能更改字符串,但我确实认为我可以将字符串转换为 char 数组,然后将每个值插入到我想要的 int 数组中。我不知道如何做到这一点,任何有关如何解决此问题的帮助或指导将不胜感激。在此先感谢

【问题讨论】:

  • 你在正确的轨道上,尝试一些东西,然后发布代码,我们会修复它。
  • 好的,我正在考虑正确的方法,因为这是我在 Java @DanAndrews 中所做的事情
  • 转换成double,然后用除法和取模提醒,这样就可以分别得到每个整数并放入2darray
  • 您也可以遍历字符串并构建二维数组:stackoverflow.com/questions/196830/…
  • 我会试一试并写下来感谢您的建议:) @MonisMajeed

标签: java arrays string


【解决方案1】:

你可以用一个衬里得到你的二维数组:

int[][] numbers = Arrays.stream("000011112222333344445555".split("(?<=\\G.{4})")).map(s -> (Arrays.stream(s.split("(?<=\\G.{1})")).mapToInt(Integer::parseInt).toArray())).toArray(int[][]::new);

【讨论】:

  • 这也行得通,真棒,你能够在一行中完成这一切,我不知道很多正则表达式,但它可以完成工作:)
  • 非常好的解决方案!
【解决方案2】:

所以这很容易做到。

lets assume your string is str;

char[] strArr = str.toCharArray();

// numbers is the range like 0 to 5 here.
// repeatCount is how many times its repeating like 4 here.

int arr[][] = new int[numbers][repeatCount];

for(int i = 0; i < numbers; i++){
    for(int j = 0; j < repeatCount; j++){
         arr[i][j] = strArr[i*repeatCount + j]-'0';
    }
}

最后一个预防措施,此功能仅在您的数字为单个数字时才有效,因为只选择一个字符。

【讨论】:

  • 我并不真正关心确保数字是否重复 4 次并且它们是 0-5,因为它们总是被确保。我只是想知道如何接受这种刺痛并将其变成 [6][4] 的数组
  • 好的,我来解释一下。 1) 使用 String 类函数 toCharArray() 将字符串转换为 char 数组。
  • 伙计,这只是数学问题。
  • 伙计,这只是数学问题。拿一张纸,以 2D 形式写下您需要的单个字符数组。矩阵中的每个点都有不同的行和列值。现在将二维矩阵逐行展平,我的意思是您将所有行放在一行中。还要在这个展平列表的顶部写入行和列值。现在找出原始位置与行号和列号之间的关系。
  • 好的,这就是我所做的,但是当我打印出来时,我得到 00004123244121533424123 而不是任何形式的数组 finishedString = cubeString; System.out.println(finishedString); char [] cubeToArr = finishedString.toCharArray(); int [][] cube = new int [6][4]; for(int i = 0; i &lt; 6; i++){ for(int j = 0; j &lt; 4;j++){ cube[i][j] = cubeToArr[i * 4 + j]-'0'; } } System.out.println(cube.toString());
【解决方案3】:

https://www.compilejava.net/ 上测试过,如果您有不同的东西也可以:

我输入 24 长度的字符串,数字为 0-5,每个数字是 一行重复4次

import java.util.ArrayList;
public class HelloWorld
{

  public static void main(String[] args)
  {
    String s = "00001111222233334444555599";
    ArrayList<ArrayList<Integer>> collection = new ArrayList<ArrayList<Integer>>();
    for (int i = 0; i <= 9; i++){
        collection.add(new ArrayList<Integer>());
    }

    for (int i = 0; i < s.length(); i++){
        int c = Character.getNumericValue(s.charAt(i));        
        collection.get(c).add(c);
    }

    for (int i = 0; i <= 9; i++){
        System.out.println(collection.get(i));
    }

    System.out.println(collection);
  }
}

结果:

[0, 0, 0, 0]
[1, 1, 1, 1]
[2, 2, 2, 2]
[3, 3, 3, 3]
[4, 4, 4, 4]
[5, 5, 5, 5]
[]
[]
[]
[9, 9]
[[0, 0, 0, 0], [1, 1, 1, 1], [2, 2, 2, 2], [3, 3, 3, 3], [4, 4, 4, 4], [5, 5, 5, 5], [], [], [], [9, 9]]

【讨论】:

  • 完成ReferenceType的int的尺寸是多少?
  • 没关系,您知道 NPE 的吗?ints[c].add(c) 行不会向c 添加任何内容
【解决方案4】:

所以你知道你的字符串必须有 4 个重复元素,我假设在 4 次重复之后,一个新值随之而来。所以对我来说,它似乎是一个 N x 4 数组。

您可以这样做,我现在将编写伪代码来帮助指导您。

int[][] myArray = new int[str.length/4][4]

我们除以 4,因为我们知道如果我们有“000011112222”,我们的总长度是 12。12/4 是 3,我们期望 3 列。 4 是我们拥有的列数,我们知道它只有 4 个。

在那之后,在这里我假设您是一个接一个地输入值,没有任何分隔符。我们可以这样做:

    int col = 0;
    int row = 0;
for(i from 0 to string length) {
    if((I+1) % 4 != 0) {
       //keep adding to myArray[row][col]
       //row++
      }
    } else { // so we now hit new numbers
       col++;
       row = 0;
      }
}

所以在这里我尝试只使用一个 for 循环。我正在考虑使用双 for 循环来做这件事,但不确定在这种情况下我将如何处理它,因为我们最初处理的是一个空数组。

快速编辑,你可以做的一件事,顺便说一句。是这样制作一个二维列表:

List<List<String>> strings = new ArrayList<List<String>>()

int index = 0;
while (index < text.length()) {
    String pattern = text.substring(index, Math.min(index + 4,text.length()));
   List<String> splitPattern = Arrays.asList(pattern.split(""));
   strings.add(splitPattern);
    index += 4;
}

所以这里的逻辑是我们创建一个子字符串,将它拆分为“”,所以什么都没有,换句话说,它只会产生 0, 0, 0, 0,因为分隔符什么都没有。然后我们将它添加到我们的列表列表中,您可以通过说 strings.get(I).get(j); 来访问它。

【讨论】:

    猜你喜欢
    • 2021-12-19
    • 1970-01-01
    • 2013-03-28
    • 1970-01-01
    • 1970-01-01
    • 2019-01-23
    • 2011-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多