我如何访问这些指数

时间:2013-06-05 15:00:54

标签: java

我有一个List如下:

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;
}

这两种方法将完全符合我想要的要求。谢谢所有人!

5 个答案:

答案 0 :(得分:6)

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

您有两种选择:

  1. 手动遍历列表并使用startsWith()(或indexOf(),具体取决于您想要的内容)
  2. 将您的数据结构更改为Map<String,String>,并使用日期作为密钥。
  3. 一般来说,您尝试将String用作结构化数据类型,但并非如此。它是非结构化的通用数据。这并不是代码中处理的最佳数据类型。

答案 1 :(得分:1)

List是您似乎想要执行的操作的错误数据结构。您应该考虑将字符串解析为两个部分,Date和另一个对象(也许是CashFlow?)并使用Map来关联这两个部分。

然后你可以做到以下几点:

//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);

答案 2 :(得分: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,如果没有找到。

抱歉修复了更多拼写问题。他提出了串行问题,我给出了严格的回答。如果声明可以修改,以适应他想要的任何搜索风格。是的,我打电话给我的列表阵列是因为输入的麻烦。

答案 3 :(得分: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;
}

答案 4 :(得分: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”方法的标准行为。更好的方法是将这个“搜索”或“启动”功能写成一个明确的名称,而这个名称不会与其他标准含义一起使用。

相关问题