我是博士研究生,希望学习一些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循环过滤数据?
答案 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();
注意: 这里有多种假设:
Scanner
类来逐行阅读。 答案 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));
}
}
我搜索了双值而不是整数。