如何比较两个对象数组来检查一个数组元素与其他数组的所有值?

时间:2013-10-17 06:40:03

标签: java

我需要比较两个对象数组来检查一个数组元素与其他数组的所有值。如果我以这种方式执行,它会在if语句中显示NULL点异常。

package unlcomp;

import java.util.HashMap;
import java.util.List;

public class relation {
    int rcount=0;
    int r1count=0;
    public String[] rel=new String[100];
    relation rm[]=new relation[100];
    relation rm1[]=new relation[100];
    public String[] UW1=new String[1000];


    public relation[] hash(String[] s,String[] s1,int rcount) {
        for(int i=1;i<=rcount;i++) {
            rm[i]=new relation();
            rm[i].rel[i]=s[i];
            rm[i].UW1[i]=s1[i];
        }
        return rm;

        // System.out.println(rcount);
    }

    public relation[] hash1(String[] s,String[] s1,int r1count) {
        for(int i=1;i<=r1count;i++) {
            rm1[i]=new relation();
            rm1[i].rel[i]=s[i];
            rm1[i].UW1[i]=s1[i];
        }
        return rm1;
    }

    public void compare() {
        relation r[]= rm;
        relation r1[]=rm1;

        for(int i=1;i<r.length;i++) {
            for(int j=1;j<r1.length;j++) {
                if(r1[i].rel[i].equals(r[j].rel[j])) {
                    System.out.println("true");

                } else {
                    System.out.println("false");
                }
            }

        }
    }
}

我需要从另一个类名称调用这个比较方法。

这是调用上述函数的类..

package unlcomp;

import java.io.File;
import java.io.IOException;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Unlcomp {
    public   String[]rel;
    public   String[]  UW1;
    public   String[]  UW2=new String[100];
    public   String[] att1=new String[100];
    public   String[] att2=new String[100];
    int i=0;

    public String[] store=new String[500];
    String pattern2="[-a-z0-9R:._-`&=*'`~\"\\+[\\s]]+[\\(]";

    //String pattern = "[(]+[-a-z0-9R:._-`&=*'`~\"\\+[\\s]]+[\\(.,]";
    String pattern = "[(]+[-a-z0-9R:_]+[(]+[-a-z0-9R:_-`&=*'`~&+,:;=?@#'<>.^*%!-\"\\+[\\s]]+[)]+[\\.\\,\\:]";
    String patterna = "[(]+[-a-z0-9R:_]+[(]+[-a-z0-9R:_-`&=*'`~&+,:;=?@#'<>.^*%!-\"\\+[\\s]]+[)]+[\\,]";
    //String pattern1="[,]+[-a-z0-9R:._-`&=*'`~\"\\+[\\s]]+[\\(.]";
    String pattern1="[,]+[-a-z0-9R:_]+[(]+[-a-z0-9R_,>-`&=*'`~&+,:;=?@#'<>.^*%!-\"\\+[\\s]]+[)]+[\\)\\.]";
    //String pattern1a="[,]+[-a-z0-9R:_]+[(]+[-a-z0-9R_,>-`&=*'`~&+,:;=?@#'<>.^*%!-\"\\+[\\s]]+[)]+[\\.]";
    String pattern3="[\\)]+[\\.@]+[-a-z0-9R:._-`&=*'`~&+,:;=?@#'<>.^*%!-\"\\+[\\s]]+[\\ ,]";
    String pattern4="[\\)]+[\\.@]+[-a-z0-9R:._-`&=*'`~&+,:;=?@#'<>.^*%!-\"\\+[\\s]]+[\\ )]";

    Pattern r = Pattern.compile(pattern);
    //Pattern ra = Pattern.compile(patterna);
    Pattern r1 = Pattern.compile(pattern1);
    //Pattern r1a = Pattern.compile(pattern1a);
    Pattern r2 = Pattern.compile(pattern2);
    Pattern r3 = Pattern.compile(pattern3);
    Pattern r4 = Pattern.compile(pattern4);

    String line;
    relation obj=new relation();
    private int rcount=0;

    public  void preprocess(String pathf1,String pathf2) throws Exception {
        try {
            Scanner scanner = new Scanner(new File(pathf1));
            scanner.useDelimiter("###"); 
            Scanner scanner1 = new Scanner(new File(pathf2));
            scanner1.useDelimiter("###"); 
            //BufferedReader br1 = new BufferedReader(new FileReader(pathf2));
            if( scanner.hasNext()) {
                if(scanner1.hasNext())
                    extract(scanner.next());
                obj.hash(rel,UW1,rcount);
                extract(scanner1.next());
                obj.hash1(rel,UW1,rcount);
                obj.compare();
            }
            scanner.close();
            scanner1.close();
        } catch (IOException e) {}
    }

    public void extract(String line) {
        String [] lines=line.split("\n"); 
        System.out.println(line);
        rel=new String[100];
        UW1=new String[100];
        for(String line1: lines ) {
            // rel=null;
            // UW1=null;
            //UW2=null;
            //att1=null;
            //att2=null;

            Matcher m2 = r2.matcher(line1);
            Matcher m1 = r1.matcher(line1);
            Matcher m3 = r3.matcher(line1);
            Matcher m4 = r4.matcher(line1);
            Matcher m = r.matcher(line1);

            if( m2.find()) {
                rel[i]=m2.group();
                rel[i]=rel[i].substring(0, rel[i].length()-1).trim();
                rcount++;
                //System.out.println(rel[i]);
            }
            if(m.find()) {
                UW1[i]=m.group();
                UW1[i]=UW1[i].substring(1, UW1[i].length()-1).trim();
            }
            i++;
        }
    }

    public  static void main(String[] args) throws Exception {
        Unlcomp u=new Unlcomp();
        String pathsr="E:/M.E/project/test.txt";
        String pathdes="E:/M.E/project/test1.txt";
        relation r=new relation();      

        u.preprocess(pathsr,pathdes);

    }
}

这将获取rm中的值,它采用数组中对象的值。我使用system.out.println()语句检查了它。我不知道如何归还它。这是这个概念的完整编码,它从文件中读取输入。

4 个答案:

答案 0 :(得分:0)

如果数组中的位置为Null,则if语句只能转换nullpointer,否则方法看起来很好,除非您只查看子数组r1[i].rel[i]中的一个位置

             if(r1[i].rel[i].equals(r[j].rel[j]))
             {
                 System.out.println("true");
             }
             else
             {
                System.out.println("false");

还会丢失非静态或最终变量的初始化

public class relation {
int rcount;
int r1count;
public String[] rel;
relation rm[];
relation rm1[];
public String[] UW1;

答案 1 :(得分:0)

问题肯定是空值。

r1或r1 [i]或r1 [i] .rel [i]或r [j]可能为空。

比较前检查空值。

答案 2 :(得分:0)

试试这个

 relation rm[];
 relation rm1[];

public relation[] hash(String[] s,String[] s1,int rcount)
{
   rm = new relation[rcount];
   rm1 = new relation[rcount];

    ...
}

// Do the same for hash1

在您的代码中,除非rcount100,否则如果null小于100则会有rcount个索引,如果IndexOutOfBounds小于100则会得到rcount (r1[i].rel[i].equals(r[j].rel[j])) 大于100。 发生这两件事是因为你声明你的数组有100个索引。

另外,这里是FYI

Objects

您实际上在比较Object reference是否引用相同的==,而不是{{1}}。我不知道这是否会影响你想要的输出。

答案 3 :(得分:0)

由于您没有更新,因此调用方法如何填充relation[] rmrm1以及compare方法,两个循环条件终点是长度,因为您已将长度定义为<{p>的100

public String[] rel = new String[100];
relation rm[] = new relation[100];

所以循环将在if (r1[i].rel[i].equals(r[j].rel[j])) {

中进行100次操作
r1[i].rel[i] , here r1[i] 
如果未在数组的该位置中使用对象

对于索引为null

您尝试对null执行的任何操作均为null.rel [i]将变为NPE

你需要照顾

public String[] rel = new String[100];
    relation rm[] = new relation[100];

确保你有所有的元素。

extract(scanner.next());
obj.hash(rel,UW1,rcount); 

在你的preprocess方法中,你确定你总是将rCount传递为100,如果没有,那么在hash方法中你没有关系对象数组中的所有元素。在进行比较之前检查null的一种方法,如

if ( r1[i] != null && r[j] != null && r1[i].rel[i].equals(r[j].rel[j]))