2013-06-05 40 views
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"); 

我現在想按如下方式訪問這些的indeces:

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

這兩種方法將履行正是我wanted.Thanks所有要求!

+1

恐怕你必須通過'List'迭代,並檢查每個項目的正則表達式,或者至少比較子字符串,如果它總是以相同的形式 –

+0

'Map'?它應該有所幫助。 – Nishant

+1

是否有可能用'Date','Income'和'Expenses' getters/setters替換你的'String'類?這將允許更簡潔的代碼。 –

回答

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,如果沒有找到。

抱歉解決了更多拼寫問題。他提出了嚴密的問題,我給出了字符串的答案。如果陳述可以修改以適應他想要的任何搜索風格。是的,我打電話給我的名單數組由於潦草的打字。

+0

從技術上講,這是一個正確的答案,但恐怕會以錯誤的方向(Stringly-typed編程)驅動OP。 –

+0

Micro-nitpick:爲什麼'List'參數被稱爲'array'? ;-) –

+0

主要挑剔:'字符串stringToFind' :) – Djon

6

你不能用任何內置方法做到這一點。

你有兩個選擇:

  1. 疊代手動列表,然後使用startsWith()(或indexOf(),這取決於你想要什麼)
  2. 改變你的數據結構到Map<String,String>,並使用日期爲關鍵。

一般而言,您試圖使用String作爲結構化數據類型,但事實並非如此。它是非結構化的通用數據。這不是您的代碼中處理的最佳數據類型。

1

A 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); 
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; 
} 
+0

在'!found'的情況下,我會返回'​​-1'來與'indexOf()'保持一致(除非你知道這個用例,異常更有用,但是這取決於上下文)。 –

+0

不,你是對的我沒有想到這一點,謝謝。 – Djon

+0

感謝您的建議以及您花在實施解決方案上的時間。 –

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」函數,並且明確的名稱不能與其他標準含義一起使用。

+0

感謝您的建議以及您花在實施解決方案上的時間。 –

相關問題