将一个Array List对象与下一个对象进行比较

时间:2017-08-04 07:31:50

标签: java file arraylist compare

大家好,我的代码

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") )那样做。

6 个答案:

答案 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