【问题标题】:Trying to display contents of ArrayList. Getting [Ljava.lang.String;@232204a1试图显示 ArrayList 的内容。获取 [Ljava.lang.String;@232204a1
【发布时间】:2015-10-02 04:08:21
【问题描述】:

我正在尝试输出 ArrayList 的内容,但无论我尝试哪种方法,我似乎都得到了 Array 的位置而不是 Array 的内容。一起运行以下每一项都会给我:

 run:
 [[Ljava.lang.String;@55f96302, [Ljava.lang.String;@232204a1, [Ljava.lang.String;@4554617c, [Ljava.lang.String;@7f31245a, [Ljava.lang.String;@2503dbd3, [Ljava.lang.String;@5cad8086]


 [Ljava.lang.String;@232204a1
 [Ljava.lang.String;@232204a1
 [Ljava.lang.String;@232204a1

这里是sn-p的代码:

// Each of the following approaches results in 
// [Ljava.lang.String;@232204a1 
// instead of the actual value of the ArrayList.

String test = accountNumbers.get(1);
System.out.println(test);

System.out.println(accountNumbers.get(1));

System.out.println(accountNumbers.get(1).toString());

// This actually outputs:
// [[Ljava.lang.String;@55f96302, [Ljava.lang.String;@232204a1, [Ljava.lang.String;@4554617c, [Ljava.lang.String;@7f31245a, [Ljava.lang.String;@2503dbd3, [Ljava.lang.String;@5cad8086] 
String str = Arrays.toString(accountNumbers.toArray()); 
System.out.println(str);

我不确定是什么原因造成的。有没有办法让内容显示?

编辑:这是整个方法。另一个问题的答案 (here) 建议我尝试使用 ArrayList 而不是我使用的方法。我调整了这个建议,但我觉得这些问题最好放在一个新问题中,而不是作为对该问题的编辑。

protected static void loadAccountInformationFromFile() throws Exception 
{

    Scanner account = new Scanner(new File(INPUT_ACCOUNT_FILE)).useDelimiter(",");

        int sortCount = 1;

        List<String> accountNumbers = new ArrayList<>();
        List<String> firstNames = new ArrayList<>();
        List<String> lastNames = new ArrayList<>();
        List<String> balances = new ArrayList<>();
        List<String> lastVariables = new ArrayList<>();


    do {

        String[] temp1 = account.next().split(",");
        String temp2 = "" + temp1;

        if (sortCount == ACCOUNT_NUMBER_COUNT) {
            accountNumbers.add(temp2);
        } else if (sortCount == FIRST_NAME_COUNT) {
            firstNames.add(temp2);
        } else if (sortCount == LAST_NAME_COUNT) {
            lastNames.add(temp2);
        } else if (sortCount == BALANCE_COUNT) {
            balances.add(temp2);
        } else if (sortCount == LAST_VARIABLE_COUNT) {
            lastVariables.add(temp2);
        }

        if (sortCount < MAX_VALUES_PER_LINE) {
            sortCount++;
        } else {
            sortCount = 1;
        }
    } while (account.hasNext());


    // Each of the following approaches results in 
    // [Ljava.lang.String;@232204a1 
    // instead of the actual value of the ArrayList.

    String test = accountNumbers.get(1);
    System.out.println(test);

    System.out.println(accountNumbers.get(1));

    System.out.println(accountNumbers.get(1).toString());

    // This actually outputs:
    // [[Ljava.lang.String;@55f96302, [Ljava.lang.String;@232204a1, [Ljava.lang.String;@4554617c, [Ljava.lang.String;@7f31245a, [Ljava.lang.String;@2503dbd3, [Ljava.lang.String;@5cad8086] 
    String str = Arrays.toString(accountNumbers.toArray()); 
    System.out.println(str);

    account.close();

    // I want to adapt what I previously used to access the ArrayLists.

 //        Bank bank = new Bank();
 //            
 //        bank.openAccount(new CheckingAccount(10100, new      Customer("Adam", "Apple"),500.00,false));
 //        bank.openAccount(new CheckingAccount(10101, new Customer("Beatrice", "Bagel"),2000.00,true));
 //        bank.openAccount(new SavingsAccount(2010, new Customer("Adam", "Apple"),5000.00,0.02));
}

编辑 2:以下是类变量:

private final static String INPUT_ACCOUNT_FILE = "accountInfo.txt";
private static final int ACCOUNT_NUMBER_COUNT = 0;
private static final int FIRST_NAME_COUNT = 1;
private static final int LAST_NAME_COUNT = 2;
private static final int BALANCE_COUNT = 3;
private static final int LAST_VARIABLE_COUNT = 4; 
private final static int MAX_VALUES_PER_LINE = 5;

编辑 3: 为了那些可能阅读此问题较晚并被某些 cmets 对正确答案感到困惑的人的利益,我的部分问题与文本文件的问题有关本身。这是文本文件格式的示例:

 10100,First,Last,Balance,value
 10101,First,Last,Balance,value
 20100,First,Last,Balance,value

另外:为了让 ArrayLists 存储正确的字符串,我必须从以下位置更改 sortCount:

int sortCount = 1;

int sortCount = 0;

因为当它设置为 1 时,它会将名字存储在帐号字符串中。

【问题讨论】:

  • 您的 accountNumbers 实例是什么?列表?你的代码对我来说很好
  • System.out.println(Arrays.toString(accountNumbers.get(1)))?
  • 索引位置是任意的。我只是想从 ArrayList 中访问任何索引位置。
  • @d1x 也许问题出在代码的其他地方?我用整个方法编辑了这个问题,以澄清发生了什么。
  • 我发布了一个我认为可能是您的问题的答案。您可以将文件的一部分作为示例发布吗?

标签: java string arraylist


【解决方案1】:

问题不在于您的“显示”,而在于您从文件中读取内容的方式。

您的代码正确打印出“地址”,因为 accountNumbers 实例中的字符串实际上就是这些值(因为您将字符串数组放入一个字符串中)。所以真正发生的是在你的 temp2 字符串中是你的 temp1.toString()。

您使用了错误的分隔符(您应该使用默认分隔符代替空格):

Scanner account = new Scanner(new File(INPUT_ACCOUNT_FILE));

然后赋值如下:

if (temp1.length > ACCOUNT_NUMBER_COUNT) {
   accountNumbers.add(temp1[ACCOUNT_NUMBER_COUNT]);
if (temp1.length > FIRST_NAME_COUNT) {
   firstNames.add(temp1[FIRST_NAME_COUNT]);
if (temp1.length > LAST_NAME_COUNT) {
   lastNames.add(temp1[LAST_NAME_COUNT]);
if (temp1.length > BALANCE_COUNT) {
   balances.add(temp1[BALANCE_COUNT]);
if (temp1.length > LAST_VARIABLE_COUNT) {
   lastVariables.add(temp1[LAST_VARIABLE_COUNT]);
}

不需要您的 temp2 和 sort 变量。

无论如何使用这些集合有点奇怪。我宁愿建议这样做:

Scanner scanner = new Scanner(new File(INPUT_ACCOUNT_FILE));
Collection<Account> bank = new ArrayList<>();

while (scanner.hasNext()) {
   String[] fields = scanner.next().split(",");
   if (fields.length < MAX_VALUES_PER_LINE) {
      continue; // incomplete row, skip it or maybe throw some exception?
   }

   String number = fields[ACCOUNT_NUMBER_COUNT];
   Customer customer = new Customer(fields[FIRST_NAME_COUNT], fields[LAST_NAME_COUNT]);
   double balance = Double.valueOf(fields[BALANCE_COUNT]);
   String type = fields[LAST_VARIABLE_COUNT];

   Account a = null;
   switch (type) {
      case "N": {
         a = new CheckingAccount(number, customer, balance);
         break;
      }
      case "0.02": {
         a = new SavingsAccount(number, customer, balance);
         break;
      }
      default: {
         continue; // unknown type of account, skip it or maybe throw some exception?
      }
   }
   bank.add(a);
}

【讨论】:

  • 实际上您的“行”在文件中是如何分隔的?通过扫描仪读取分隔符是逗号然后用逗号再次分割它是很奇怪的。
  • 好吧,问题是如果我从循环中删除 .split,NetBeans 会给我一个错误。如果我改为删除它编译的 .useDelimiter,但会给出错误:索引 1
  • 这里是一个文件示例,它将从以下位置加载:10100,Adam,Apple,500.00,N 10101,Breatrice,Bagel,2000.00,Y 20100,Chris,Cucumber,5000.00,0.02 20101,David, Dakon,3500.00,0.02 10102,Ethel,Endame,1000.00,Y 20103,Adam,Apple,6000.00,0.02
  • 好的,我更新了答案,您在创建 Scanner 实例时使用了错误的分隔符
  • 嗯。当我删除分隔符时,它仍然给我错误:索引 1,大小 1。
【解决方案2】:
String temp2 = "" + temp1;

你试图用一个字符串数组连接一个空白,这等于

String temp2 = "" + temp1.toString();

请注意,数组的 toString() 将返回对象引用,而不是值。 因此,您应该尝试将数组转换为一些 Java Collection 类,该类实现了 toString() 方法,如 ArrayList

String temp2 = "" + Arrays.asList(temp1).toString();

或者你也可以这样做

String temp2 = "" + Arrays.toString(temp1);

两者都会给你字符串值(我猜还有一些“[”和“]”,因为 ArrayList 和 Arrays 的 toString() 实现,你可以计算出来)。

【讨论】:

    猜你喜欢
    • 2018-01-18
    • 1970-01-01
    • 2018-05-28
    • 1970-01-01
    • 2021-03-01
    • 1970-01-01
    • 2014-11-26
    • 1970-01-01
    • 2021-04-11
    相关资源
    最近更新 更多