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

Java 如何比较对象的两个数组以检查一个数组元素与其他数组的所有值?,java,Java,我需要比较对象的两个数组来检查一个数组元素和其他数组的所有值。若我以这种方式执行,它将在If语句中显示空点异常 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 re

我需要比较对象的两个数组来检查一个数组元素和其他数组的所有值。若我以这种方式执行,它将在If语句中显示空点异常

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;
导入java.util.HashMap;
导入java.util.List;
公共阶级关系{
int rcount=0;
int r1计数=0;
公共字符串[]rel=新字符串[100];
关系rm[]=新关系[100];
关系rm1[]=新关系[100];
公共字符串[]UW1=新字符串[1000];
公共关系[]散列(字符串[]s,字符串[]s1,int rcount){
对于(int i=1;i-`&=*'`&+,:;=?@\\\\\'.^*%!-\“\\+[\\s]]+[)]+[\\.]”;
字符串模式3=“[\\)]+[\\.@]+[-a-z0-9R:.\-`&=*'`&+,:;=?@\\\'.^*%!-“\+[\\s]]+[\\,]”;
字符串模式4=“[\\)]+[\\.@]+[-a-z0-9R:.\-`&=*'`&+,:;=?@\\\'.^*%!-“\+[\\s]]+[\\)]”;
Pattern r=Pattern.compile(Pattern);
//Pattern ra=Pattern.compile(patterna);
patternR1=Pattern.compile(pattern1);
//模式r1a=Pattern.compile(模式1a);
Pattern r2=Pattern.compile(Pattern 2);
patternr3=Pattern.compile(pattern3);
patternR4=Pattern.compile(pattern4);
弦线;
关系obj=新关系();
私有整数rcount=0;
公共void预处理(字符串路径F1、字符串路径F2)引发异常{
试一试{
Scanner Scanner=new Scanner(新文件(pathf1));
scanner.useDelimiter(“####”);
Scanner scanner1=新扫描仪(新文件(路径F2));
扫描仪1.使用分隔符(“####”);
//BufferedReader br1=新的BufferedReader(新文件读取器(路径F2));
if(scanner.hasNext()){
if(scanner1.hasNext())
提取(scanner.next());
对象哈希(rel、UW1、rcount);
提取(scanner1.next());
对象hash1(rel、UW1、rcount);
obj.compare();
}
scanner.close();
扫描头1.close();
}捕获(IOE){}
}
公共void提取(字符串行){
字符串[]行=行。拆分(“\n”);
系统输出打印项次(行);
rel=新字符串[100];
UW1=新字符串[100];
用于(字符串行1:行){
//rel=null;
//UW1=null;
//UW2=null;
//att1=null;
//att2=null;
匹配器m2=r2.匹配器(第1行);
匹配器m1=r1。匹配器(第1行);
匹配器m3=r3.匹配器(第1行);
匹配器m4=r4。匹配器(第1行);
匹配器m=r匹配器(第1行);
if(m2.find()){
rel[i]=m2.group();
rel[i]=rel[i]。子字符串(0,rel[i]。长度()-1)。修剪();
rcount++;
//系统输出println(rel[i]);
}
if(m.find()){
UW1[i]=m.群();
UW1[i]=UW1[i]。子字符串(1,UW1[i]。长度()-1)。修剪();
}
i++;
}
}
公共静态void main(字符串[]args)引发异常{
Unlcomp u=新Unlcomp();
字符串pathsr=“E:/M.E/project/test.txt”;
字符串pathdes=“E:/M.E/project/test1.txt”;
关系r=新关系();
u、 预处理(路径sr、路径des);
}
}

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

如果数组中的位置为Null,if语句只能强制转换Null指针,否则方法看起来很好,除非您只查看子数组中的一个位置
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;

问题肯定出在空值上

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

在比较之前检查空值。

试试这个

 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
在您的代码中,除非
rcount
100
,否则如果
rcount
小于100,将有
null
索引,如果
rcount
大于100,您将得到
indexootfounds
。 这两种情况会发生,因为您将数组声明为具有100个索引

另外,这里仅供参考

(r1[i].rel[i].equals(r[j].rel[j]))

实际上,您正在比较
对象是否引用了相同的
对象引用
,而不是实际的
=
。我不知道这是否会影响您所需的输出。

因为您没有更新,所以您正在调用方法来填充
关系[]
rm
rm1
compare
方法中,两个循环条件的终点是长度,正如您为

public String[] rel = new String[100];
relation rm[] = new relation[100];
因此,如果(r1[i].rel[i].equals(r[j].rel[j]){

如果尚未在数组的该位置初始化对象,则索引为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]))

当询问NPE时,请发布堆栈跟踪…投票按原样关闭…如何调用
hash()
hash1()
,你要传递什么
字符串
数组?你在哪里向数组添加数据?@Thihara-堆栈跟踪不会告诉我们任何新的信息。她已经告诉我们哪一行出现异常。我猜数组中某处有空值。如何检查空值??
extract(scanner.next());
obj.hash(rel,UW1,rcount); 
if ( r1[i] != null && r[j] != null && r1[i].rel[i].equals(r[j].rel[j]))