从文本文件java中向arraylist添加数字

时间:2013-09-03 05:18:57

标签: java text arraylist coordinates point

我的数据文件如下所示(第1列-x;第2列;第3列):

    46    80     2
    95    75     2
    78    85     2
    59    54     1
    81    52     2
    57    78     1
    72    46     2

我试图将x和y坐标保存在两个不同的点阵中,具体取决于它们的类型。

import java.util.*;
import java.util.ArrayList;
import java.io.*;
import java.awt.Point;

public class program {

    public static void main(String []args)  {
        ArrayList knots = new ArrayList<Point>();
        ArrayList zeros = new ArrayList<Point>();
        List<Integer> list = new ArrayList<Integer>();
        String line = null;
        String file = "hepatitis_data1.txt";
        BufferedReader reader;
        try  {
            reader = new BufferedReader(new FileReader(file));
            while((line = reader.readLine()) != null)  {
                String tmp[] = line.split(" +");

                System.out.println(line);
                for (String s:tmp) {
                    s = s.trim();
                    if(s.length() > 0)  {
                    int i = Integer.parseInt(s.trim());
                    int r = Integer.parseInt(tmp[1].trim());
                    int g = Integer.parseInt(tmp[2].trim());
                    if (tmp[3].equals("1"))  {
                        knots.add(new Point(r,g));
                    }
                    else if(tmp[3].equals("2"))  {
                        zeros.add(new Point(r,g));
                    }
                }
            }
        }

        catch (FileNotFoundException e)  {
            e.printStackTrace();
        } catch (IOException e)  {
            e.printStackTrace();
        }

        int total = knots.size() + zeros.size();
        System.out.println("knot size" + knots.size());
        System.out.println("zero size" + zeros.size());
        System.out.println("total size" + total);

    }   
}

它没有显示任何错误,但也没有做正确的事情。总值应为83,因为我有83对x-y坐标,但总数为240。 任何帮助?

3 个答案:

答案 0 :(得分:1)

您正在执行while语句来读取文件,并在其中为每行执行for循环。对于每一行,for循环发生了3次(!!!!),这正是那里的问题。做:

import java.util.*;
import java.util.ArrayList;
import java.io.*;
import java.awt.Point;

public class program {

    public static void main(String []args)  {
        ArrayList knots = new ArrayList<Point>();
        ArrayList zeros = new ArrayList<Point>();
        List<Integer> list = new ArrayList<Integer>();
        String line = null;
        String file = "hepatitis_data1.txt";
        BufferedReader reader;
        try  {
            reader = new BufferedReader(new FileReader(file));
            while((line = reader.readLine()) != null)  {
                String tmp[] = line.split(" +");

                System.out.println(line);
                String s = tmp[0];
                    s = s.trim();
                    if(s.length() > 0)  {
                    int i = Integer.parseInt(s.trim());
                    int r = Integer.parseInt(tmp[1].trim());
                    int g = Integer.parseInt(tmp[2].trim());
                    if (tmp[3].equals("1"))  {
                        knots.add(new Point(r,g));
                    }
                    else if(tmp[3].equals("2"))  {
                        zeros.add(new Point(r,g));
                    }
            }
        }

        catch (FileNotFoundException e)  {
            e.printStackTrace();
        } catch (IOException e)  {
            e.printStackTrace();
        }

        int total = knots.size() + zeros.size();
        System.out.println("knot size" + knots.size());
        System.out.println("zero size" + zeros.size());
        System.out.println("total size" + total);

    }   
}

答案 1 :(得分:0)

我认为下面的代码每行重复三次,它将数据添加到结和零(3次)。所以你的总价值是240;

for (String s:tmp) {
                s = s.trim();
                if(s.length() > 0)  {
                int i = Integer.parseInt(s.trim());
                int r = Integer.parseInt(tmp[1].trim());
                int g = Integer.parseInt(tmp[2].trim());
                if (tmp[3].equals("1"))  {
                    knots.add(new Point(r,g));
                }
                else if(tmp[3].equals("2"))  {
                    zeros.add(new Point(r,g));
                }


          }

它可能会有所帮助

感谢

答案 2 :(得分:0)

我使用了您提供的示例数据,如前所述,它与您使用的增强型for循环相比,运行时间超过了需要增加ArrayLists的大小。 1}}。我的修订版:

import java.util.*;
import java.util.ArrayList;
import java.io.*;
import java.awt.Point;

public class program {

public static void main(String []args)  {
    ArrayList knots = new ArrayList<Point>();
    ArrayList zeros = new ArrayList<Point>();
    List<Integer> list = new ArrayList<Integer>();
    String line = null;
    String file = "hepatitis_data1.txt";
    BufferedReader reader;
    try  {
        reader = new BufferedReader(new FileReader(file));
        while((line = reader.readLine()) != null)  {
            String tmp[] = line.split(" +");

            System.out.println(line);
            int x = Integer.parseInt(tmp[1].trim());
            int y = Integer.parseInt(tmp[2].trim());
            int type = Integer.parseInt(tmp[3].trim());
            if(type == 1)
                knots.add(new Point(x,y));
            if(type == 2)
                zeros.add(new Point(x,y));
        }

    }

    catch (FileNotFoundException e)  {
        e.printStackTrace();
    } catch (IOException e)  {
        e.printStackTrace();
    }
    int total = knots.size() + zeros.size();
    System.out.println("knot size " + knots.size());
    System.out.println("zero size " + zeros.size());
    System.out.println("total size " + total);
        }

    }

在这种特殊情况下,我可以向您Scanner而不是BufferedReader提出建议。 ScannernextInt()方法可用于直接阅读ints而无需解析任何Strings