0

我有一个列表如下:

List<String> x = new ArrayList<String>();
x.add("Date : Jul 15, 2010 Income : 8500 Expenses : 0");
x.add("Date : Aug 23, 2010 Income : 0 Expenses : 6500");
x.add("Date : Jul 15, 2010 Income : 0 Expenses : 4500");

我现在想按如下方式访问这些索引:

int index1 = x.indexOf("Date : Aug 23, 2010");
//1

int index2 = x.indexOf("Date : Jul 15, 2010");
//0

int index3 = x.lastIndexOf("Date : Jul 15, 2010");
//2

有什么帮助吗?提前致谢。

这是我一直在寻找的解决方案:

// traverse the List forward so as to get the first index
private static int getFirstIndex(List<String> theList, String toFind) {
    for (int i = 0; i < theList.size(); i++) {
        if (theList.get(i).startsWith(toFind)) {
            return i;                
        }
    }
    return -1;
}

// traverse the List backwards so as to get the last index
private static int getLastIndex(List<String> theList, String toFind) {
    for (int i = theList.size() - 1; i >= 0; i--) {
        if (theList.get(i).startsWith(toFind)) {
            return i;               
        }
    }
    return -1;
}

这两种方法将完全满足我想要的要求。谢谢大家!

4

5 回答 5

6

您无法使用任何内置方法来做到这一点。

你有两个选择:

  1. 手动迭代列表并使用startsWith()(或indexOf(),取决于你想要什么)
  2. 将您的数据结构更改为 aMap<String,String>并使用日期作为键。

一般来说,您尝试将其String用作结构化数据类型,但事实并非如此。它是非结构化的通用数据。这并不是在您的代码中处理的最佳数据类型。

于 2013-06-05T15:02:57.943 回答
1

List对于您似乎想要做的事情,A是错误的数据结构。您应该考虑将字符串解析为两部分,aDate和另一个对象(CashFlow也许?)并使用 aMap将两者联系起来。

然后您可以执行以下操作:

//Parse the string into a Date and CashFlow object
Date august = ...
CashFlow flow = ...
Map<Date, CashFlow> map = new HashMap<>();
map.put(august, flow);
//Later...
CashFlow c = map.get(august);
于 2013-06-05T15:05:00.713 回答
0

您可以像这样编写一个新类:

class SpecialArrayList<String> extends ArrayList<String>{

    @Override
    public int indexOf(Object o) {
        for (int i = 0; i < this.size(); i++) {
            java.lang.String t = (java.lang.String)this.get(i);
            if (t.startsWith((java.lang.String) o)) {
                return i;
            }
        }
        return -1;
    }
}

然后你可以使用

List<String> x = new SpecialArrayList<String>();

但正如其他答案中提到的那样,寻找这样的字符串并不是最好的风格。您将更改“indexOf”方法的标准行为。最好用一个不与其他标准含义一起使用的明确名称来编写这个“搜索”或“startswith”函数。

于 2013-06-05T15:41:25.853 回答
0

我会写一个函数

public static int getIndexOf(List<String> array, String stringToFind)
{
    for(int i = 0; i < array.size(); i++)
       if(array.get(i).contains(stringToFind);
           return i;
    return -1;
}

只需遍历列表,搜索字符串,然后返回您想要的。否则,如果没有找到则返回 -1。

抱歉修复了更多拼写问题。他提出了严格的问题,我给出了严格的回答。可以修改 if 语句以适应他想要的任何搜索风格。是的,由于打字草率,我将列表称为数组。

于 2013-06-05T15:05:09.057 回答
0

如果我真的必须在没有 的情况下这样Map做,我会这样做;

public int getIndex(List<String> x, String key)
{
    boolean found = false;
    int index = 0;
    for (String s: x)
    {
      if (s.startsWith(key))
      {
        found = true;
        break;
      }
      index++;
    }
    if (!found)
    {
      index = -1;
    }

    return index;
}
于 2013-06-05T15:05:29.880 回答