为什么 Java 字符串数组在第一个单元格中将字符串附加到 null?

Why is Java string array appending a string to null in first cell?

下面是我的class,比较两个字符串数组中的元素,returns两个数组中出现频率最高的词。但是,从输出中可以看出,第一个索引将 none 附加到 null,尽管用 String none. 初始化了两个数组有人可以让我知道我做错了什么导致到这个?

public class HelloWorld{
    
    public String[] pro;
    public String[] con;
    String proSplitter;
    String conSplitter;
    
    public HelloWorld() {
        this.pro = new String[9];
        this.con = new String[9];
        for(int i=0;i<this.pro.length;i++)
        {
            this.pro[i]="none";
            this.con[i]="none";
        }
    }

    public String[] getPro() {
        return pro;
    }

    public String[] getCon() {
        return con;
    }

    public void setPro(String pros, int proIndex) {
        pro[proIndex] = pros;
    }

    public void setCon(String cons, int conIndex) {
        con[conIndex] = cons;
    }
    
    public String[] proWord(){
        for(int i=0;i<9;i++)
        {
            proSplitter = proSplitter + pro[i] + ",";
        }
        for(int i=0;i<9;i++)
        {
            conSplitter = conSplitter + con[i] + ",";
        }
        String[] values = proSplitter.split(",");
        for(int i=0;i<values.length;i++)
        {
            values[i] = values[i].trim();
        }
        String[] values1 = conSplitter.split(",");
        for(int i=0;i<values1.length;i++)
        {
            values1[i] = values1[i].trim();
        }

        int [] fr = new int [values.length];
        int visited = -1;

        for(int i = 0; i < values.length; i++){
            int count = 1;
            for(int j = i+1; j < values.length; j++){
                if(!values[i].equalsIgnoreCase("none"))
                {
                    if(values[i].compareTo(values[j])==0){
                        count++;
                        //To avoid counting same element again
                        fr[j] = visited;
                    }
                }
            }
            if(fr[i] != visited)
                fr[i] = count;
        }

        int max = fr[0];
        int index = 0;

        for (int i = 0; i < fr.length; i++)
        {
            if (max < fr[i])
            {
                max = fr[i];
                index = i;
            }
        }

        int [] fr1 = new int [values1.length];
        int visited1 = -1;

        for(int i = 0; i < values1.length; i++){
            int count1 = 1;
            for(int j = i+1; j < values1.length; j++){
                if(!values1[i].equalsIgnoreCase("none"))
                {
                    if(values1[i].compareTo(values1[j])==0){
                        count1++;
                        //To avoid counting same element again
                        fr1[j] = visited1;
                    }
                }
            }
            if(fr1[i] != visited1)
                fr1[i] = count1;
        }
        for(int i = 0;i<values.length;i++)
        {
            System.out.println("pro = "+values[i]);
        }
        for(int i = 0;i<values1.length;i++)
        {
            System.out.println("con = "+values1[i]);
        }
        int max1 = fr1[0];
        int index1 = 0;

        for (int i = 0; i < fr1.length; i++)
        {
            if (max1 < fr1[i])
            {
                max1 = fr1[i];
                index1 = i;
            }
        }

        String sentence[] = new String[2];
        if(values[index].equalsIgnoreCase(values1[index1])) {
            sentence[0] = "balanced";
        }else {
            sentence[0] = values[index];
            sentence[1] = values1[index1];
        }
        return sentence;
    }
    public static void main(String[] args){
        
        HelloWorld tracker = new HelloWorld();
        
        tracker.setPro("Apple, Pear", 1);
        tracker.setCon("Banana", 1);
        tracker.setPro("Apple", 2);
        tracker.setCon("Water Melon", 2);
        tracker.setPro("Guava", 3);
        tracker.setCon("Ball", 3);
        tracker.setPro("Apple", 4);
        tracker.setCon("Mango, Plum", 4);
        
        String[] arr = tracker.proWord();
        System.out.println("pro = "+arr[0]);
        System.out.println("con = "+arr[1]);
    }
}

正在生成的输出是:

pro = nullnone
pro = Apple
pro = Pear
pro = Apple
pro = Guava
pro = Apple
pro = none
pro = none
pro = none
pro = none
con = nullnone
con = Banana
con = Water Melon
con = Ball
con = Mango
con = Plum
con = none
con = none
con = none
con = none
pro = Apple
con = nullnone

所述,直接的问题是您让 proSplitter 未初始化,因此它的值为 null。然后,当你用 proSplitter = proSplitter + pro[i] + ","; 向其附加一个字符串时,proSplitter 将(有效地)转换为 "null",然后将东西附加到末尾。因此,改为 "" 一开始。

但是,您在这里遇到了另一个问题,即每次调用该方法时您都在改变一个成员变量 - 所以它第二次不是 null(或空),它仍然包含那里的内容以前。

解决方法很简单:不使用成员变量,而是将它们声明为局部变量。

您还遇到了一个问题,您正在有效地复制代码来计算数组中最频繁的事物:这就是方法的用途,允许您 运行 相同的代码不同的输入。

您还可以使用库方法。例如:

String mostFrequent(String[] array) {
  int maxFreq = 0;
  String maxFreqS = "";
  for (String s : array) {
    if (s.equalsIgnoreCase("none")) continue;

    int freq = Collections.frequency(Arrays.asList(array), s);
    if (freq > maxFreq) {
      maxFreq = freq;
      maxFreqS = s;
    }
  }
  return maxFreqS;
}

(这里有很多低效的地方。重点更多的是把它写成一个方法,以消除重复)。

然后您可以在现有方法中使用它,其他人和您阅读起来会容易得多。