【问题标题】:first element is overridden in the java.util.Listjava.util.List 中的第一个元素被覆盖
【发布时间】:2016-10-13 06:02:37
【问题描述】:

我有一个转换为字符串数组的列表。在数组的索引 0 处,我分配了字符串 "Select a value"。现在,当我遍历 String 数组时,第一个元素被我指定为“选择一个值”的值覆盖。

下面是代码:

List<LocalDate> localDatesList = new ArrayList<LocalDate>();
localDatesList.add(new LocalDate());
localDatesList.add(new LocalDate().plusDays(1));
localDatesList.add(new LocalDate().plusDays(2));
localDatesList.add(new LocalDate().plusMonths(1));
localDatesList.add(new LocalDate().plusMonths(2));
List<String> tempDatesList = new ArrayList(localDatesList.size());
for (LocalDate date : localDatesList) {
    tempDatesList.add(date.toString());  
}
String[] formattedDates = tempDatesList.toArray(new String[localDatesList.size()]);
formattedDates[0]="Select a value";
for (String dates : formattedDates) {
    System.out.println(dates);
}

输出:

2016-10-14
2016-10-15
2016-11-13
2016-12-13

我试图将大小增加 1,但 null 被添加到最后一个索引,并且它没有显示当前日期(我在列表中添加的第一个元素)。

请建议我缺少什么,如何在索引零或列表中的第一个元素处添加值 "Select a Value"。当我添加 formattedDates[0]="Select a value" 时,列表中缺少第一个元素。

【问题讨论】:

  • 当我运行该代码时,我首先看到“选择一个值”。鉴于您的列表有 5 元素并且您只在输出中显示 4 ,我强烈怀疑问题是您没有看到输出的第一行由于某些原因。将您编写的代码放入一个直接的控制台应用程序中,我相信您会看到我所做的。现在,您如何看待“错误”的价值?它实际上是在控制台应用程序中,还是在其他地方?
  • 为什么需要tempDatesList

标签: java arrays collections


【解决方案1】:

您在这一行中覆盖了您的第一个元素:

formattedDates[0]="选择一个值";

像这样更改您的代码并在循环之前添加“选择一个值”:

List<LocalDate> localDatesList = new ArrayList<LocalDate>();
localDatesList.add(new LocalDate());
localDatesList.add(new LocalDate().plusDays(1));
localDatesList.add(new LocalDate().plusDays(2));
localDatesList.add(new LocalDate().plusMonths(1));
localDatesList.add(new LocalDate().plusMonths(2));

List<String> tempDatesList = new ArrayList(localDatesList.size());
tempDatesList.add("Select a value");
for (LocalDate date : localDatesList) {
    tempDatesList.add(date.toString());
}

String[] formattedDates = tempDatesList.toArray(new String[localDatesList.size()]);
for (String dates : formattedDates) {
    System.out.println(dates);
}

【讨论】:

    【解决方案2】:

    当您输入值“选择一个值”时,您会更改数组的第一个值。你可以这样做:

    String[] formattedDates = new String[localDatesList.size() + 1];
    formattedDates[0]="Select a value";
    System.arraycopy(tempDatesList.toArray(), 0, formattedDates, 1, tempDatesList.toArray().length);
    

    【讨论】:

      【解决方案3】:

      您正在自己覆盖第一个元素。您不能增加数组的大小,无论您为特定位置分配什么,都将使用该值进行更新。如果您更改它将针对该特定位置进行更改。

      在您的代码中,您通过选择一个值(formattedDates[0]="Select a value";)来分配 0 位置。

      所以在将列表更改为数组之前,将"Select a value"添加到列表中,然后转换。然后它就可以正常工作了。

      tempDatesList.add("Select a value");

      然后添加日期

      for (LocalDate date : localDatesList) {
          tempDatesList.add(date.toString());  
      }
      

      然后

      tempDatesList.toArray(new String[localDatesList.size()]);
      

      这里是精炼的代码:

      List<String> localDatesList = new ArrayList<String>();
      localDatesList.add(LocalDate.now().toString());
      localDatesList.add(LocalDate.now().plusDays(1).toString());
      localDatesList.add(LocalDate.now().plusDays(2).toString());
      localDatesList.add(LocalDate.now().plusMonths(1).toString());
      localDatesList.add(LocalDate.now().plusMonths(2).toString());
      localDatesList.add("Select a value");
      String[] formattedDates = localDatesList.toArray(new String[localDatesList.size()]);
      for (String dates : formattedDates) {
          System.out.println(dates);
      }
      

      【讨论】:

        【解决方案4】:

        我已经为你修改了代码。

        public static void main(final String arhgsp[]) {
            final List<LocalDate> localDatesList = new ArrayList<>();
            localDatesList.add(LocalDate.now());
            localDatesList.add(LocalDate.now().plusDays(1));
            localDatesList.add(LocalDate.now().plusDays(2));
            localDatesList.add(LocalDate.now().plusMonths(1));
            localDatesList.add(LocalDate.now().plusMonths(2));
            final List<String> tempDatesList = new ArrayList<>(localDatesList.size());
            for (final LocalDate date : localDatesList) {
                tempDatesList.add(date.toString());
            }
            final String[] formattedDates = tempDatesList.toArray(new String[localDatesList.size()]);
            formattedDates[0] = "Select a value";
            for (final String dates : formattedDates) {
                System.out.println(dates);
            }
        }
        

        产生输出

        Select a value
        2016-10-14
        2016-10-15
        2016-11-13
        2016-12-13
        

        希望这对你有用。

        【讨论】:

          猜你喜欢
          • 2013-03-03
          • 1970-01-01
          • 2013-06-06
          • 1970-01-01
          • 2012-01-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-12-19
          相关资源
          最近更新 更多