2

好的,基本上我想将字符串中的元素与 int 和 char 值分开,同时保留在数组中,但老实说,最后一部分不是必需的,如果我需要将值分成两个不同的数组,那就这样吧,id就像为了整洁而把它们放在一起。这是我的输入:

5,4,A
6,3,A
8,7,B
7,6,B
5,2,A
9,7,B

现在我到目前为止的代码通常可以完成我想要它做的事情,但并不完全

这是我设法用我的代码产生的输出,但这是我卡住的地方

54A
63A
87B
76B
52A
97B

这是有趣的部分,我需要获取数字和字符值并将它们分开,以便我可以在比较/数学公式中使用它们。

基本上我需要这个

int 5, 4;
char 'A';

但当然存储在它们所在的数组中。这是我到目前为止提出的代码。

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.List;


public class dataminingp1 
{

    String[] data = new String[100];
    String line;

    public void readf() throws IOException 
    {

        FileReader fr = new FileReader("C:\\input.txt");
        BufferedReader br = new BufferedReader(fr);

        int i = 0;
        while ((line = br.readLine()) != null) 
        {
            data[i] = line;
            System.out.println(data[i]);
            i++;
        }
        br.close();
        System.out.println("Data length: "+data.length);

        String[][] root;

        List<String> lines = Files.readAllLines(Paths.get("input.txt"), StandardCharsets.UTF_8);

        root = new String[lines.size()][];

        lines.removeAll(Arrays.asList("", null)); // <- remove empty lines

        for(int a =0; a<lines.size(); a++)
        {
            root[a] = lines.get(a).split(" ");
        }

        String changedlines;
        for(int c = 0; c < lines.size(); c++)
        {
            changedlines = lines.get(c).replace(',', ' '); // remove all commas
            lines.set(c, changedlines);// Set the 0th index in the lines with the changedLine
            changedlines = lines.get(c).replaceAll(" ", ""); // remove all white/null spaces
            lines.set(c, changedlines);
            changedlines = lines.get(c).trim(); // remove all null spaces before and after the strings
            lines.set(c, changedlines);
            System.out.println(lines.get(c));

        }
    }

    public static void main(String[] args) throws IOException 
    {
        dataminingp1 sarray = new dataminingp1();
        sarray.readf();
    }   
}

我想尽可能轻松地做到这一点,因为我与 Java 并没有太远,但我正在学习,所以如果需要,我可以通过一个困难的过程来管理。提前感谢您提供的任何帮助。由于它的简单性,真正开始喜欢 java 作为一门语言。

这是对我的问题的补充,以消除任何混淆。我想要做的是获取存储在我在 code/input.txt 中的字符串数组中的值,并将它们解析为不同的数据类型,例如字符的 char 和整数的 int。但我不确定目前该怎么做,所以我要问的是,有没有办法同时解析这些值,而不必将它们分成不同的数组,因为我不确定 id 是如何做到的,因为它会很疯狂遍历输入文件并准确找到每个 char 的开始位置和每个 int 的开始位置,我希望这能澄清一点。

4

6 回答 6

1
 for(int c = 0; c < lines.size(); c++){
            String[] chars = lines.get(c).split(",");
            String changedLines = "int "+ chars[0] + ", " + chars[1] + ";\nchar '" + chars[0] + "';";
            lines.set(c, changedlines);
            System.out.println(lines.get(c));

        }
于 2013-10-15T06:42:33.647 回答
1

如果您的输入格式像这样标准化,这很容易。只要您不指定更多(比如一行中可以有 3 个以上的变量,或者 char 可以在任何列中,而不仅仅是第三列,最简单的方法是:

    String line = "5,4,A";
    String[] array = line.split(",");
    int a = Integer.valueOf(array[0]);
    int b = Integer.valueOf(array[1]);
    char c = array[2].charAt(0);
于 2013-10-15T06:42:48.923 回答
1

这是您可以做的事情:

    int i = 0;
    for (i=0; i<list.get(0).size(); i++) {
        try {
            Integer.parseInt(list.get(0).substring(i, i+1));
            // This is a number
            numbers.add(list.get(0).substring(i, i+1));
        } catch (NumberFormatException e) {
            // This is not a number
            letters.add(list.get(0).substring(i, i+1));
        }
    }

当字符不是数字时,它会抛出 NumberFormatException,所以,你知道它是一个字母。

于 2013-10-15T06:44:40.947 回答
1
List<String> lines = Files.readAllLines(Paths.get("input.txt"), StandardCharsets.UTF_8);
String[][] root = new String[lines.size()][];

for (int a = 0; a < lines.size(); a++) {
    root[a] = lines.get(a).split(","); // Just changed the split condition to split on comma
}

您的root数组现在包含二维数组格式的所有数据,其中每一行代表输入中的每条记录/行,每列都有所需的数据(如下所示)。

5   4   A   
6   3   A   
8   7   B   
7   6   B   
5   2   A   
9   7   B

您现在可以遍历数组,您知道每行的前 2 列是您需要的数字,最后一列是字符。

于 2013-10-15T06:50:38.457 回答
1

通过使用getNumericValue()isDigit方法尝试这种方式。这也可能有效,

String myStr = "54A";
        boolean checkVal;
        List<Integer> myInt = new ArrayList<Integer>();
        List<Character> myChar = new ArrayList<Character>();
        for (int i = 0; i < myStr.length(); i++) {
            char c = myStr.charAt(i);
            checkVal = Character.isDigit(c);
            if(checkVal == true){
                myInt.add(Character.getNumericValue(c));
            }else{
                myChar.add(c);
            }

        }
        System.out.println(myInt);
        System.out.println(myChar);

还要检查,检查字符属性

于 2013-10-15T07:17:33.950 回答
1

也许这样的事情会有所帮助?

List<Integer> getIntsFromArray(String[] tokens) {
  List<Integer> ints = new ArrayList<Integer>();
  for (String token : tokens) {
    try {
      ints.add(Integer.parseInt(token));
    } catch (NumberFormatException nfe) {
      // ...
    }
  }
  return ints;
}

这只会抓取整数,但也许你可以稍微修改一下来做你想做的事:p

于 2013-10-15T06:49:16.857 回答