从txt导入数组列表并过滤掉数字

时间:2014-09-22 13:44:36

标签: java arrays

我是博士研究生,希望学习一些java编程。

我正在进行心率变异性分析的研究,我想制作一个简单的程序,允许我从.txt文件输入数组列表,过滤掉一些数据,并将过滤后的数据导出到新的.txt文件。我已经在QBasic :)中创建了这个程序,但是我也想在java中完成它。

我能够得到第一部分,如何导入数组:

public class random {
    public static void main (String[] args) throws FileNotFoundException
{
  Scanner s = new Scanner(new File("c:\\data.txt"));
  ArrayList<String> list = new ArrayList<String>();
  while (s.hasNext()){
      list.add(s.next());
  }
  s.close();

程序应该从txt文件中过滤重复的双重类型数字,并仅将新的txt文档中的唯一值打印出来。在这里,您有我原来的问题,在那里您可以看到我的意思:

Extraction of unique values form a array list

用户建议使用此代码,如果我手动插入数字,该代码可以正常工作。

 int[] input = new int[]{0, 0, 0, 0, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 5, 5, 5, 5, 8, 8, 10, 10, 2, 2, 2, 3, 3, 7, 7};
 int current = input[0];
 boolean found = false;

 for (int i = 1; i < input.length; i++) {
     if (current == input[i] && !found) {
         found = true;
     } else if (current != input[i]) {
         System.out.print(" " + current);
         current = input[i];
         found = false;
     }
 }
 System.out.print(" " + current);

有没有人有我的建议,而不是手动插入数字,从文本文件导入数组列表并使用前面代码中的for循环过滤数据?

4 个答案:

答案 0 :(得分:2)

这取决于文件中数字的存在方式。假设你有一个每行数字的文件,

您可以read the file line by line,而不是循环遍历数组。

//This is needed because unlike your array solution we do not know the first element already.
//If your file can have -1, use a number that you are sure will not be in the file
//If you are not sure that there is such a nunmber, use the wrapper class Integer and check for null
int current = -1; 

BufferedReader br = new BufferedReader(new FileReader(file));
String line;
while ((line = br.readLine()) != null) 
{
   try
   {
       int i = Integer.parseInt(line); //use Double.parseDouble if the numbers can be decimals.
   }
   catch(NumberFormatException e)
   {
       //The line is not a number. So, some currupt data
       System.out.println("Encountered a non-number value in a line, ignoring value);
       e.printStacktrace();
   }
   if(current == -1)
   {
       current = i;
   }
  if (current == input[i] && !found) {
      found = true;
  ...
  ...

}
br.close();

注意: 这里有多种假设:

  • 该文件每行有一个数字。如果文件是用逗号分隔的,则需要更改方法。使用Java读取逗号分隔值(CSV):Java - Read CSV with Scanner()
  • 您可以使用上面链接答案中的Scanner类来逐行阅读。
  • 您所拥有的“重复检查”逻辑假定文件中的数据已排序(因此重复项是一个接一个。如果不是这种情况,则需要使用Set或类似结构来检查重复。请参阅Remove Duplicate Lines from Text using Java以获取示例,但请注意,有关删除重复项的答案,您不一定要删除。

答案 1 :(得分:1)

由于您在此处尝试删除重复项,因此最简单的方法是使用Set

    Scanner s = new Scanner(new File("c:\\data.txt"));
    HashSet<Double> set = new HashSet<Double>();



    while(s.hasNextDouble()){
        set.add(s.nextDouble());
    }

    System.out.println(set);

}

编辑:删除立即复制品

这不像使用Set那样简单但不复杂

Scanner s = new Scanner(new File("c:\\data.txt"));
ArrayList<Double> list = new ArrayList<Double>();

double next = s.nextDouble();
list.add(next);
double previous = next;
while(s.hasNextDouble()){
    next = s.nextDouble();
    if(next!=previous){
        list.add(next);
        previous = next;
    }

}

答案 2 :(得分:0)

s.hasNext返回一个布尔值,而不是一个字符串,因此您的ArrayList填充了布尔值而不是数字。

改为执行此操作;

public class Main {

    public static void main (String[] args) throws FileNotFoundException
    {
  Scanner s = new Scanner(new File("//data.txt"));
  ArrayList<String> list = new ArrayList<String>();

  while (s.hasNext()){
      String str = s.nextLine();
      list.add(str);
  }
  s.close();
  System.out.println(list
          );
   }

}

答案 3 :(得分:0)

因为数组的长度是固定的,所以我建议你使用像TreeSet这样的Collection:

  Scanner scanner = new Scanner("c:\\data.txt");
  TreeSet<Double> list = new TreeSet<Double>();
  while (scanner.hasNextDouble()) {
     double nextDouble = scanner.nextDouble();
     Double lastFound = list.last();
     if(lastFound != null && lastFound.doubleValue() != nextDouble) {
        list.add(new Double(nextDouble));
     }
  }

我搜索了双值而不是整数。