2

我的数据文件看起来像这样(第 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 对 xy 坐标,但总数为 240。有什么帮助吗?

4

3 回答 3

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);

    }   
}
于 2013-09-03T05:34:20.867 回答
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));
                }


          }

它可能会有所帮助

谢谢

于 2013-09-03T05:31:19.100 回答
0

我让它与您提供的示例数据一起使用,正如之前所述,它与for您使用的增强循环有关,它运行的次数超过了增加ArrayLists. 我的修订:

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

于 2013-09-03T06:30:47.053 回答