将String元素从数组转换为值为整数Array

时间:2014-12-07 10:41:35

标签: java arrays string integer

我不允许使用除String和IO Class

之外的任何类的方法

所以我的代码片段是:

String line = reader.readLine();
while (line != null) {
    String[] elements = line.split(",");
    // Array could be too big if there are multiple occurances of
    // the same number
    // Array length + 1 because I can't use the 0 and with a input line of
    // 1,2,3 for example would be the length 3 but I would have the
    // numbers 0,1,2 in the Array as my index.
    String[][] placeholderMatrix = new String[elements.length+1][elements.length+1];
    for(int i = 0; i < elements.length-1; i++){
        placeholderMatrix[(int)elements[i]][(int)elements[i+1]] = 1;
    }
    line = reader.readLine();
}

在我得到的文件中只有这样的数字:1,2,3,4,5,8,7,4 所以在我的分割字符串数组中只有数字,但现在如果我想将它们用作我的Matrix(placeholderMatrix)的索引

我的问题是在我的for循环中,我想将它们用作我的索引我不能使用它们,因为它是一个字符串数组。通常我会使用Integer.parseInt,但我不允许:/ 关于如何将它们作为我的索引实现的任何想法?以及我如何才能获得Matrix的完美长度?因为如果我得到以下数字:1,2,2,2,3我的矩阵应该只有数字:

0 1 2 3
1
2
3

但如果我使用elements.length + 1作为我的Matrix的长度,我会得到数字0 1 2 3 4 5

希望你能理解我的问题。抱歉我的英文不好,并提前致谢。

编辑:我有另一个问题。如果我实现Dici的方法(parseInt)并在“placeholderMatrix [parse(elements [i])] [parse(elements [i + 1])] = 1;”中使用它我收到错误ArrayOutOfBounce,因为我定义的Array只是我分裂的String Array元素的长度。但是如果我用Integer.MAX_VALUE定义它作为我的长度我会得到一个内存错误,因为它太大了。有什么想法吗?

Edit2:我的任务: 我必须用“,”分隔一行数字。 (我将使用String split方法将其拆分以仅获取数字)现在我必须创建一个Matrix(2维数组)并在我的新String Array的索引i和索引i +处查找数字1并且必须将第一个数字作为我的列,第二个作为我的行(反之亦然)并在那一点实现1.现在是我的数字我将从1获得到Integer.MAX_VALUE所以我将不得不创建这样的一个大矩阵,但这是不可能的,因为我得到了MemoryError。

错误:java.lang.OutOfMemoryError:请求的数组大小超过VM限制     在Test.main(Test.java:29)

要了解我必须做的事情:http://de.wikipedia.org/wiki/Adjazenzmatrix右边的图像,但是数字从到Integer.MAX_VALUE,所以我的2D数组必须定义为Integer.MAX_VALUE的长度?

编辑:

所以Dici问了一个例子:

我的序列可能是:1,2,5,4 所以我的矩阵应该是:

sample matrix

希望这就是你想要的Dici 但是我从序列中得到的数字是1到Integer.MAX_VALUE

3 个答案:

答案 0 :(得分:0)

为了将字符串转换为整数,您可以简单地实现自己的整数解析器,它并不复杂。您可以从此开始,并在需要时进行改进。

public int parseInt(String s) { 
    int n   = 0;
    int pow = 1;
    for (int i=s.length() - 1 ; i>=0 ; i--) {
       String si = String.valueOf(s.charAt(i);

       if (si.matches("[0-9]")) {
           n   += pow*(s.charAt(i) - '0');
           pow *= 10;
       } else if (si.matches("+|-") && i == 0) 
           n   *= s.charAt(i) == '+' ? 1 : -1;
         else 
           throw new NumberFormatException();        
    }
    return n;
}

然后,我会处理你问题的第二部分。如果Integer.MAX_VALuE是您的输入值之一,则无法分配Integer.MAX_VALUE x Integer.MAX_VALUE矩阵。您需要做的是为输入值分配连续的ID并在地图中记录ID,以便您可以轻松访问与一个节点值对应的矩阵的索引。这是一个让你理解的例子:

public void someMethod() {
    int id = 0;
    Map<Integer,Integer> idMap = new HashMap<>();
    String[] split = reader.readLine().split(",");
    int   [] nodes = new int[split.length];

    for (int i=0 ; i<nodes.length ; i++) {
        nodes[i] = parseInt(split[i]);
        if (!idMap.containsKey(nodes[i])) 
            idMap.put(nodes[i],id++);
    }

    // the map is now constructed, it should probably be stored in an attribute

    int[][] placeholderMatrix = new int[nodes.length][nodes.length];
    for(int i = 0; i < nodes.length; i++){
        if (i > 0)              placeholderMatrix[idMap.get(nodes[i])][idMap.get(nodes[i-1])] = 1;
        if (i < nodes.length-1) placeholderMatrix[idMap.get(nodes[i])][idMap.get(nodes[i+1])] = 1;
    }
}

还有其他方法可以做,请告诉我这个解决方案是否正常

答案 1 :(得分:0)

您可以执行以下操作:

String keyword = "1,2,3,4,5,8,7,4";//input line from file
  String replacedKeyword = keyword.replaceAll("[^\\d]", "");//except numbers replace all. Assuming one digit numbers only.
  String[][] placeholderMatrix = new String[replacedKeyword.length()+1][replacedKeyword.length()+1];
  char keys[] = replacedKeyword.toCharArray();
  for (int i = 0; i<keys.length - 1;  i++) {
    placeholderMatrix[keys[i] - '0'][keys[i + 1] -'0'] = "1";
  }

答案 2 :(得分:0)

我无法完全理解你想要的东西。但是,如果这将有助于一个简单的方法将字符串数转换为int:

int toInt(String number) {
    int num = 0;
    for (int i=0; i<number.length(); i++) {
        num = num*10 + (number.charAt(i)-'0');
    }
    return num;
}