2013-03-16 82 views
-2

我正在爲android設備製作一個應用程序。我的應用程序中有一個函數,它有2個for循環,每個迭代3200次,訪問一個53 KB的.txt文件(其中包含3200行),並將字符串與每行進行比較,每次迭代一行。 「for循環」還包含BufferedReader(),InputStreamReader(),InputStream()和StringTokenizer()。所以當我在模擬器上運行應用程序時,它需要大約8秒的時間處理該功能。這是不可接受的。我該如何縮短所需時間,例如半秒或最大時間。 1秒?謝謝! 編輯:這是我的程序與2 for循環的一部分:如何讓for()循環花費更少的時間(android)?

else if(a==2){ 
     String z=""; 
     try{ 
      InputStream is = getAssets().open("USCOUNTIES.txt"); 
      InputStreamReader iz=new InputStreamReader(is); 
      BufferedReader bis = new BufferedReader(iz); 

      int v=0; 

      v=count("USCOUNTIES.txt");//counts number of lines in the .txt file 
     //finding no. of counties to be displayed 
      int counter=0; 
      String pos; 
      pos=Integer.toString(position); 
      try{ 
      for(int i=0;i<v;i++){ 
       z=bis.readLine(); 
       //int x=pos.length(); 
       boolean a; 
       //using stringtokenizer 
       StringTokenizer st = new StringTokenizer(z, ","); 
       String substring; 
       substring=(String) st.nextElement(); 
       a=substring.equals(pos); 
       if(a==true){ 

        counter=counter+1; 

       } 
      }}catch(Exception e){e.printStackTrace();} 
      String array1[]=new String[counter]; 

      try{ 
       InputStream ig = getAssets().open("USCOUNTIES.txt"); 
       InputStreamReader ia=new InputStreamReader(ig); 
       BufferedReader bos = new BufferedReader(ia); 
      int j=0; 
      for(int i=0;i<v;i++){ 
       z=bos.readLine(); 
       String[] split = z.split(","); 
       if(split[0].equals(pos)){ 
        array1[j]=split[1]; 
        j=j+1; 
       } 

      }} 
      catch(Exception e){e.printStackTrace();} 
+1

老實說,8秒鐘讀取3200個文件,每行3200行是相當不錯的。 – 2013-03-16 21:04:55

+0

它是一個單一的3200內襯文件。它迭代3200次。你可能有什麼建議?我這樣做是爲了將一些文件的數據放在列表中。 – 2013-03-16 21:08:21

+7

爲什麼你重新閱讀相同的文件** 3200次**? – CommonsWare 2013-03-16 21:08:56

回答

1

如果我是你,我會分析一切只是一個時間,然後用它做任何你想要的。

這段代碼就是這樣做的,包括Integers的解析(我懷疑你需要這些作爲值,而不是Strings):

public void read() throws IOException { 
    InputStream is = getAssets().open("USCOUNTIES.txt"); 
    InputStreamReader iz=new InputStreamReader(is); 
    BufferedReader bis = new BufferedReader(iz); 
    String line = ""; 
    String firstNumber = ""; 
    String secondNumber = ""; 
    String countyName = ""; 
    StringTokenizer st = null; 
    HashMap<Pair, String> map = new HashMap<>(); 
    while((line = bis.readLine()) != null) { 
     st = new StringTokenizer(line, ","); 
     firstNumber = (String) st.nextElement(); 
     st = new StringTokenizer((String)st.nextElement(), ">"); 
     secondNumber = (String) st.nextElement(); 
     countyName = ((String) st.nextElement()); 
     countyName = countyName.substring(0, countyName.length()-1); 
     int num1 = Integer.parseInt(firstNumber); 
     int num2 = Integer.parseInt(secondNumber); 
     map.put(new Pair(num1, num2), countyName); 
    } 
} 

class Pair { 
    int num1, num2; 
    Pair(int num1, int num2) { 
     this.num1 = num1; 
     this.num2 = num2; 
    } 

    public boolean equals(Object other) { 
     if (other instanceof Pair) { 
      Pair np = (Pair) other; 
      return this.num1 == np.num1 && this.num2 == np.num2; 
     } 
     return false; 
    } 

    public int hashCode() { 
     return (Integer.valueOf(num1).hashCode() >> 13)^Integer.valueOf(num2).hashCode(); 
    }; 
} 

現在,你可以簡單地檢索每個countyName這一行:

String s = map.get(new Pair(1,69)); 

並返回Aleutians East

我希望得到你開始。

EDIT

這段代碼使用2D SparseArray(很像HashMap<Integer, Object>)。有了這個,所有東西都按第一個數字排序。

public class Reader { 
    private String firstNumber = ""; 
    private String secondNumber = ""; 
    private String countyName = ""; 
    private StringTokenizer stringTokenizer = null; 
    private SparseArray<SparseArray<String>> sparseArray = new SparseArray<SparseArray<String>>(); 
    private SparseArray<String> temporarySparseArray = null; 

    public void readFromIS() throws IOException { 
     InputStream is = getAssets().open("USCOUNTIES.txt"); 
     InputStreamReader iz=new InputStreamReader(is); 
     BufferedReader bis = new BufferedReader(iz); 
     String line = null; 
     while((line = bis.readLine()) != null) { 
      readLine(line); 
     } 
    } 

    public void readFromList() { 
     String[] strings = { 
       "0,1>Autauga;", 
       "0,2>Baldwin;", 
       "0,3>Barbour;", 
       "1,69>Aleutians East;",  
       "1,68>Aleutians West;" 
     }; 
     for (String line : strings) { 
      readLine(line); 
     } 
    } 

    private void readLine(String line) { 
     stringTokenizer = new StringTokenizer(line, ","); 
     firstNumber = (String) stringTokenizer.nextElement(); 
     stringTokenizer = new StringTokenizer((String)stringTokenizer.nextElement(), ">"); 
     secondNumber = (String) stringTokenizer.nextElement(); 
     countyName = ((String) stringTokenizer.nextElement()); 
     countyName = countyName.substring(0, countyName.length()-1); 
     int num1 = Integer.parseInt(firstNumber); 
     int num2 = Integer.parseInt(secondNumber); 
     if (sparseArray.get(num1) == null) { 
      sparseArray.put(num1, new SparseArray<String>()); 
     } 
     temporarySparseArray = sparseArray.get(num1); 
     temporarySparseArray.put(num2, countyName); 
     sparseArray.put(num1, temporarySparseArray); 
     temporarySparseArray = null; 
    } 

    public void test() { 
     readFromList(); 
     String s = sparseArray.get(0).get(2); 
     SparseArray sa = sparseArray.get(0); 
     System.out.println(sa.size()); //should be 3 
     System.out.println(s); // should be Baldwin 
    } 
} 

並檢索與num1開始所有的縣,說,0,你只需要使用:

SparseArray<String> startingWithZero = sparseArray.get(0); 

FYI:一個SparseArrayintegers一個HashMap,所以不是一切都要autoboxed(從Integerint,因爲您不能將原始類型放入HashMap)。

EDIT2您打印1D sparseArray的地址。

public void printEverythingStartingWithZero() { 
    SparseArray<String> subSparseArray = sparseArray.get(0); //You first need a 1D sparseArray 
    int key = 0; 
    for(int i = 0; i < subSparseArray.size(); i++) { 
     key = subSparseArray.keyAt(i); 
     String county = subSparseArray.get(key); //county is the String in place (0,key) 
     System.out.println(county); 
    } 
} 

您需要首先檢索1D sparseArray,並且前導零。

+0

非常感謝這段代碼!我有個問題。如果我想返回所有具有num1 = 1的字符串,例如String s = map.get(new Pair(1,i)),其中i來自for循環並從0到3200進行迭代。是否有更好的實現這一目標的方式? – 2013-03-17 09:59:06

+0

您必須以任一方式循環,因爲您需要整個列表的一個子集。但也許可以用2D'sparseArray'。勒姆檢查。 – stealthjong 2013-03-17 10:21:49

+0

這是可能的,看到我的補充。 – stealthjong 2013-03-17 11:03:46