【问题标题】:Unusual output from using split()使用 split() 的异常输出
【发布时间】:2013-04-13 06:53:24
【问题描述】:

我正在读取具有以下格式的文件: 名称 : 症状 : 原因 : 治疗 : 发生率 : 预后

总共有 21 个条目,但是当我尝试从文件中读取并使用 .split(":"); 时,输出每次都会更改,但始终遵循以下行:[Ljava.lang.String; @614951ff。我猜它是指针或内存地址,但我想要字符串值。我没有得到任何例外,所以我不确定我哪里出错了。该方法的目的是读取文件并使用所选给定文件行的分隔符拆分为数组。

public String[] readCancer(int row) {
    cancers = new String[22];
    FileInputStream fis;
    InputStreamReader isr;
    BufferedReader br = null;
    String eachCancer;
    String[] splitCancer = null;
    int j = 0;
    try {
        fis = new FileInputStream(myData);
        isr = new InputStreamReader(fis);
        br = new BufferedReader(isr);
        input = new Scanner(br);
        while(input.hasNext() && j < 23) {
            cancers[j++] = input.nextLine();
        }
        eachCancer = cancers[row].toString();
        splitCancer = eachCancer.split(":");
    } catch (IOException iox) {
        JOptionPane.showMessageDialog(null, "Problem with file input");
    } finally {
        try {
            if(br != null) {
                br.close();
            }
        } catch (IOException iox) {
            JOptionPane.showMessageDialog(null, "Problem closing the file");
        }
    }
    return splitCancer;
}

【问题讨论】:

  • 你能粘贴样本 i/p 和 o/p 以及你得到什么吗?
  • 你能不能把调用这个方法的代码贴出来看看它是如何使用返回的String[]的。因为当您尝试将 String[] 视为 String 时,会打印 [LString... 之类的内容。
  • 使用 Arrays.toString(splitCancer) 显示它
  • @Raghunandan 你需要转义:吗?
  • 我不这么认为@squiguy ;)

标签: java arrays split


【解决方案1】:

打印数组的内容:

1)System.out.println(Arrays.deepToString(splitCancer));

2)System.out.println(Arrays.toString(splitCancer));

3)System.out.println(Arrays.asList(splitCancer));

【讨论】:

  • 我尝试了第二个选项,它非常适合将数据打印到控制台!我需要返回字符串数组的方法。当我尝试使用 return Arrays.toString(splitCancer) 时,它会立即标记一个编译器错误,指出 splitCancer 是一个字符串,但我在方法中将其声明为 String[]。我怎样才能让它返回实际的字符串内容而不是地址,因为我必须进一步操作数据,如果它作为 String[] 返回是最简单的?
  • Arrays.toString(splitCancer) 会给我们一个String,您的实际返回语句return splitCancer; 返回一个String[],只是您不能使用System.out.println() 打印数组的各个字符串(元素)。如果您只需要访问数组的元素,您可以使用像 splitCancer[0] 这样的索引,如果数组的长度至少为 1,则应给出数组的第一个元素。
  • 当我尝试诸如 split[j] = "blah";并返回它,那么没有编译错误但是当 split[j] = cancers[j].split(":");分配给cancers[j] = input.nextLine();或cancers[j] = input.nextLine().toString();,然后我不断收到不兼容类型的编译错误。
  • 在您发布带有数据的实际代码之前,我无能为力。对不起 4 简洁,使用我的 BB 输入
  • 数据、我用来测试方法的主要方法和最近的代码尝试都在这个答案中:stackoverflow.com/a/15990881/1767133
【解决方案2】:

如果要显示字符串数组,应该use:

System.out.println(Arrays.toString(splitCancer));

因为当你打印splitCancer 时,你会得到数组的地址而不是它的内容。

当然你可以用其他方式打印内容:

for(String str : splitCancer) {
   System.out.println(str);
}

【讨论】:

  • 你能告诉我 Str.split("\\:") 比 Str.split(":") 有什么优势吗?
  • @noob 我编辑了我的答案,这是我的错。 : 应该在不转义的情况下工作。
  • @MarounMaroun 我将如何将 splitCancer 作为 String[] 返回,因为即使我将 splitCancer 声明为 String[],它似乎也将其视为字符串?我试着做 return Arrays.toString(splitCancer);但是编译器给出了一个错误,说它需要一个 String[] but found String.
  • 你不返回Arrays.toString..如果你想打印数组使用它。如果你想返回数组,你必须return splitCancer; .
  • @MarounMaroun 我已经尝试过这样做,但它似乎并没有像我目前拥有的那样工作。我不确定我做错了什么。 cancers[j] = input.nextLine(); 似乎存在逻辑错误
【解决方案3】:

目前我有以下:

public String[] readCancer() {
    cancers = new String[22];
    split = new String[22];
    FileInputStream fis;
    InputStreamReader isr;
    BufferedReader br = null;
    String eachCancer;
    int j = 0;
    try {
        fis = new FileInputStream(myData);
        isr = new InputStreamReader(fis);
        br = new BufferedReader(isr);
        input = new Scanner(br);
        while(input.hasNext() && j < 23) {
            cancers[j] = input.nextLine().toString();
            //cancers[j] = input.nextLine();
            split[j] = cancers[j].split(":");
            //split[j] = "blah";    this line works
            j++;
        }
        System.out.println(Arrays.toString(split));
    } catch (IOException iox) {
        JOptionPane.showMessageDialog(null, "Problem with file input");
    } finally {
        try {
            if(br != null) {
                br.close();
            }
        } catch (IOException iox) {
            JOptionPane.showMessageDialog(null, "Problem closing the file");
        }
    }
    return split;
    //return split[j]; does not work
}

在我的 while 循环中,我不断收到编译错误,说它需要一个字符串,但找到了用于拆分的 Stirng[]。当我尝试更简单的方法时,例如 split[j] = "blah";,没有编译错误。我可以完美地返回癌症,但我需要用 : 分隔符分割,这似乎是我无法理解的东西。当我尝试返回 split[j] 时,我得到另一个编译错误,说它需要一个 String[] 但找到了 String。我已经在这里待了一个多小时,阅读了我的教科书和在线教程中的示例以使用拆分,但它仍然无法正常工作。这是我的程序中唯一我不知道该怎么做的部分。

【讨论】:

    【解决方案4】:

    我尝试粘贴整个文件,但它出现了一个可怕的文本块,所以这里有 2 行。每行格式相同,但长度不同:

    文件的一般格式是名称:症状:原因:治疗:发生率:预后

    该比率是一个字符串,因为它对于某些疾病是未知的,并且当它已知时,该比率并不总是超过 250,000。有时它是1,000,000或100,000等......

    急性早幼粒细胞白血病:容易瘀伤、快速内出血、疲劳、贫血、频繁发烧、感染、血栓:PML 和 RARA 基因:药物、化疗:250,000 分之一:好

    家族性圆柱瘤病:许多皮肤肿瘤、溃疡、感染、视力、听力、嗅觉、平衡受损:CYLD 基因:手术、化疗:未知:未知

    我最近的代码尝试是Unusual output from using split()

    cancer 和 split 的 2 个数组是私有 String[] 作为在任何方法之外声明的字段变量。变量 myData 是一个私有文件,也声明为任何方法之外的字段变量。我已检查并已验证文件路径是否正确。

    调用方法的main方法:

    public static void main(String[] args) {  
        CancerGUI _gui = new CancerGUI();
        String[] resultCancer;
        resultCancer = _gui.readCancer();
        //System.out.println(resultCancer);
        System.out.println(Arrays.toString(resultCancer));
    }
    

    我只是在main方法中调用它来测试它是否正确返回String[]。一旦完成,然后我将用另一种方法调用它,将数据添加到 GUI(这部分我有理由相信我知道如何去做,并且有来自我的导师和教科书的示例)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-12
      • 1970-01-01
      • 2011-01-28
      • 1970-01-01
      • 1970-01-01
      • 2020-03-12
      相关资源
      最近更新 更多