大家好,我的代码
public class Main {
public static List<String> globalList;
public static void main(String[] args) {
globalList = new ArrayList<String>();
File folder = new File("\\Documents\\Folder);
File[] listOfFiles = folder.listFiles();
for(File file : listOfFiles) {
dosomething(file);
}
for( String t : globalList)
{
System.out.println(t);
}
}
public static void dosomething(File file) {
try {
BufferedReader in = new BufferedReader(new FileReader(file));
String str;
while ((str = in.readLine()) != null) {
globalList.add(str);
}
in.close();
} catch (IOException e) {
System.out.println(e);
}
}
}
在我的文件夹中,我有几个文件。每个文件都包含一行信息,因此我将每一行都保存到我的Arraylist globalList
中。现在我想比较我的ArrayList中的一个对象和下一个对象,这可能吗?
就像:if(firstobj == nextobj)将其删除。
修改
对不起,伙计们我忘了要写的东西....
问题是,我需要删除的行不完全相同,因为它们以生成的数字开头,这个数字对于那些文件很重要所以我不能删除它...
所以我需要比较我的行的一部分,如果我需要删除它。
一个例子:
10133; 1; XXXX 110; 4100; Autotour 4M100; 30; 0; K; 0 ;;; 0; 2; 3; XXXX
10134; 1; XXXX 110; 4100; Autotour 4M100; 30; 0; K; 0 ;;; 0; 2; 3; XXXX
10135; 1; XXXX 110; 4100; Autotour 4M100; 15; 0; K; 0 ;;; 0; 2; 3; XXXX
所以现在你看到前两行几乎相同,除了起始编号,我需要找到那些行并删除它们。由于变化,我不能像if(list.contains("10135;1;XXXX 110;4100;Autotour 4M100;15;0;K;0;;;0;2;3;XXXX") )
那样做。
答案 0 :(得分:0)
是的,这是可能的。您可以使用equals
方法来比较线条。但是,您应该在读取文件时比较行,而不是将文件内容存储在list
中并进行比较。 E.g:
try(BufferedReader reader1 = new BufferedReader(new FileReader(file1));
BufferedReader reader2 = new BufferedReader(new FileReader(file2));){
String line1 = reader1.readLine();
String line2 = reader2.readLine();
if(line1 != null && line1.equals(line2)){
//Do something
}
}catch(Exception e){
//Exception handling
}
答案 1 :(得分:0)
编辑:
如果你有相同的生成数字后面跟分号这样的转义字符,你可以得到第一个分号的索引,并得到从下一个字符开始的子字符串:
public static void dosomething(File file) {
try {
BufferedReader in = new BufferedReader(new FileReader(file));
String str;
while ((str = in.readLine()) != null) {
// remove spaces from beginning and end of the input string
str = str.trim();
String subString = str.substring(str.indexOf(";") + 1, str.length());
boolean match = false;
// search in globalList for a match
for(String elem : globalList)
{
if(elem.contains(subString)){
match = true;
break;
}
}
// if it doesn't contain the string add it
if(!match)
globalList.add(str);
}
in.close();
} catch (IOException e) {
System.out.println(e);
}
}
另一个版本:
Allow less secure apps:
答案 2 :(得分:0)
我认为您只是想确保最终得到一个包含每个&#39;唯一的&#39;来自每个文件的行。
如果是这种情况,您可以使用Set(https://docs.oracle.com/javase/7/docs/api/java/util/Set.html)的实现来代替globaList
,例如HashSet https://docs.oracle.com/javase/7/docs/api/java/util/HashSet.html
set实现将确保不添加重复项。
答案 3 :(得分:0)
我认为你正在寻找像这样的东西
Iterator<String> iterator = globalList.iterator();
String lastObj = null;
String nextObj = null;
while (iterator.hasNext()){
nextObj = iterator.next();
if(lastObj == null ){
lastObj = nextObj;
}
else {
if(lastObj.equals(nextObj)){
iterator.remove();
}
}
}
答案 4 :(得分:0)
在您的情况下,如果您不想每次检查部件字符串是否包含在列表中,那么如果您有一个巨大的文件则需要几个小时,而您可以使用不允许的Set
重复。 set的独特之处在于它不允许重复,因此不是将字符串列表包装在自定义类中的字符串,然后覆盖类的equals和hashcode实现,这样它就不会考虑字符串的一部分直到第一个字符串中出现分号。
终于找到了工作代码..
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashSet;
import java.util.Set;
public class MyString
{
public static Set<MyString> globalSet;
private String line;
public String getLine(){
return this.line;
}
public void setLine(String newLine){
this.line = newLine;
}
public static void main(String[] args) {
File folder = new File("C:\\Users\\hbm5cf7\\Documents\\NewF");
globalSet = new HashSet<MyString>();
File[] listOfFiles = folder.listFiles();
for(File file : listOfFiles) {
dosomething(file);
}
for(MyString t : globalSet)
{
System.out.println(t.getLine());
}
}
public static void dosomething(File file)
{
try {
BufferedReader in = new BufferedReader(new FileReader(file));
MyString str;
String line;
while ((line = in.readLine()) != null) {
str = new MyString();
str.setLine(line);
globalSet.add(str);
}
in.close();
}catch(IOException e)
{
System.out.println(e);
}
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((line == null) ? 0 : line.split(";", 2)[1].hashCode());
return result;
}
@Override
public boolean equals(Object obj)
{
if (this == obj)
{
return true;
}
if (getClass() != obj.getClass())
{
return false;
}
if (this.line.equals(((MyString) obj).getLine()))
{
return true;
}
String splitString = ((MyString) obj).getLine().split(";", 2)[1];
if(this.line.endsWith(splitString))
{
return true;
}
return false;
}
}
通过覆盖equals和hashcode方法,您可以决定哪一个是重复的,哪个不是根据您的要求
答案 5 :(得分:0)
@Harish Barma
文件内容: 文件1:
2;XXXX;XXXX;;P;XX;XXX;1N410;20170719;1;;;0;0;1;999;1;1;;
10000;1;XXXX 096;1410;Autotour 1N410;15;0;K;0;;;0;2;;XXXX
10001;2;XXXX 097;1410;Autotour 1N410;10;0;K;0;;;0;2;;XXXX
10002;3;XXXX 098;1410;Autotour 1N410;13;0;K;0;;;0;2;;XXXX
10003;4;XXXX 099;1410;Autotour 1N410;19;0;K;0;;;0;2;;XXXX
10004;5;XXXX 100;1410;Autotour 1N410;15;0;K;0;;;0;2;;XXXX
文件2:
2;XXXX;XXXX;;P;XX;XXXX;3A680;20170726;1;;;0;0;1;999;1;1;;
10082;1;XXX S146;3680;Autotour 3A680;5;0;K;0;;;0;2;;XXXx
10083;2;XXX S147;3680;Autotour 3A680;8;0;K;0;;;0;2;;XXXX
10084;3;XXX 095;3680;Autotour 3A680;6;0;K;0;;;0;2;3;XXXX
文件3:
2;XXXX;XXXX;;P;XX;XXX;4M100;20170719;1;;;0;0;1;999;1;1;;
10129;1;XXXX 110;4100;Autotour 4M100;30;0;K;0;;;0;2;3;XXXX
10130;1;XXXX 110;4100;Autotour 4M100;30;0;K;0;;;0;2;3;XXXX
10131;1;XXXX 110;4100;Autotour 4M100;30;0;K;0;;;0;2;3;XXXX
10132;1;XXXX 110;4100;Autotour 4M100;30;0;K;0;;;0;2;3;XXXX
10133;1;XXXX 110;4100;Autotour 4M100;30;0;K;0;;;0;2;3;XXXX
10134;1;XXXX 110;4100;Autotour 4M100;30;0;K;0;;;0;2;3;XXXX
10135;1;XXXX 110;4100;Autotour 4M100;15;0;K;0;;;0;2;3;XXXX
(文件5-100可以包含与文件3相同的行或不同的行,如文件1或2)。 代码:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.*;
public class MyString
{
public static Set<MyString> globalSet;
private String line;
public String getLine(){
return this.line;
}
public void setLine(String newLine){
this.line = newLine;
}
@Override
public boolean equals(Object obj)
{
if (this == obj)
{
return true;
}
if (getClass() != obj.getClass())
{
return false;
}
if (this.line.equals(((MyString) obj).getLine())) //compiler said i need to do this so...
{
return true;
}
String splitString = ((MyString) obj).getLine().split(";", 2)[1]; //compiler said i need to do this so...
if(this.line.endsWith(splitString))
{
return true;
}
return false;
}
public static void main(String[] args) {
File folder = new File("C:\\Users\\V90xxxxPCN\\Documents\\Neuer Ordner");
File[] listOfFiles = folder.listFiles();
for(File file : listOfFiles) {
dosomething(file);
}
for(MyString t : globalSet)
{
System.out.println(t.getLine());
}
}
public static void dosomething(File file)
{
try {
globalSet = new HashSet<MyString>();
BufferedReader in = new BufferedReader(new FileReader(file));
MyString str = new MyString();
String line;
while ((line = in.readLine()) != null) {
str.setLine(line);
globalSet.add(str);
}
}catch(IOException e)
{
System.out.println(e);
}
}
}
预期产出:
2;XXXX;XXXX;;P;XX;XXX;1N410;20170719;1;;;0;0;1;999;1;1;;
10000;1;XXXX 096;1410;Autotour 1N410;15;0;K;0;;;0;2;;XXXX
10001;2;XXXX 097;1410;Autotour 1N410;10;0;K;0;;;0;2;;XXXX
10002;3;XXXX 098;1410;Autotour 1N410;13;0;K;0;;;0;2;;XXXX
10003;4;XXXX 099;1410;Autotour 1N410;19;0;K;0;;;0;2;;XXXX
10004;5;XXXX 100;1410;Autotour 1N410;15;0;K;0;;;0;2;;XXXX
2;XXXX;XXXX;;P;XX;XXXX;3A680;20170726;1;;;0;0;1;999;1;1;;
10082;1;XXX S146;3680;Autotour 3A680;5;0;K;0;;;0;2;;XXXx
10083;2;XXX S147;3680;Autotour 3A680;8;0;K;0;;;0;2;;XXXX
10084;3;XXX 095;3680;Autotour 3A680;6;0;K;0;;;0;2;3;XXXX
2;XXXX;XXXX;;P;XX;XXX;4M100;20170719;1;;;0;0;1;999;1;1;;
10135;1;XXXX 110;4100;Autotour 4M100;15;0;K;0;;;0;2;3;XXXX
输出:
10135;1;XXXX 110;4100;Autotour 4M100;15;0;K;0;;;0;2;3;XXXX