如何使for()循环花费更少的时间(android)?

如何使for()循环花费更少的时间(android)?,android,optimization,iteration,Android,Optimization,Iteration,我正在为android设备制作一个应用程序。在我的应用程序中有一个函数,它有2个“for循环”,每个循环迭代3200次,访问一个53kb.txt文件(包含3200行),并将字符串与每行进行比较,每次迭代一行。“for循环”还包含BufferedReader()、InputStreamReader()、InputStream()和StringTokenizer()。因此,当我在模拟器上运行应用程序时,它需要大约8秒钟来处理该功能。这是无法接受的。如何将所需时间减少到半秒或最多1秒?谢谢 编辑:这是

我正在为android设备制作一个应用程序。在我的应用程序中有一个函数,它有2个“for循环”,每个循环迭代3200次,访问一个53kb.txt文件(包含3200行),并将字符串与每行进行比较,每次迭代一行。“for循环”还包含BufferedReader()、InputStreamReader()、InputStream()和StringTokenizer()。因此,当我在模拟器上运行应用程序时,它需要大约8秒钟来处理该功能。这是无法接受的。如何将所需时间减少到半秒或最多1秒?谢谢 编辑:这是我的程序中包含2个for循环的部分:

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();}
else如果(a==2){
字符串z=“”;
试一试{
InputStream is=getAssets().open(“USCOUNTIES.txt”);
InputStreamReader iz=新的InputStreamReader(is);
BufferedReader bis=新的BufferedReader(iz);
int v=0;
v=count(“USCOUNTIES.txt”);//统计.txt文件中的行数
//查找要显示的县数
int计数器=0;
字符串位置;
pos=整数。toString(位置);
试一试{

对于(inti=0;i如果我是你,我会只解析所有内容一次,然后根据你的需要处理它

这段代码就是这样做的,包括对
整数的解析(我怀疑您需要这些值,而不是
字符串
):

返回阿留申群岛东部

我希望这能让你开始

编辑

这段代码使用2D
SparseArray
(非常类似于
HashMap

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
    }
}
仅供参考:
SparseArray
整数的
HashMap
,因此并非所有内容都必须自动装箱(从
Integer
int
,因为不能将基本类型放入
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);
    }
}
public void打印一切从零开始(){
SparseArray subsparserray=SparseArray.get(0);//首先需要1D SparseArray
int键=0;
对于(int i=0;i

您需要首先检索1D
sparseArray
,前导为零。

老实说,8秒读取3200个文件,每行3200行,非常好。这是一个单独的3200行文件。它被迭代了3200次。您有什么建议吗?我这样做是为了将文件的一些数据放入列表中。您为什么要读取t他把同一个文件加载了3200次?嗯,如果是一个文件,为什么要加载3200次?只加载一次,你的文件结构是什么?看到你在文件中迭代了完全相同的行数,我怀疑你可以只迭代一次,然后将所有内容解析成一个映射。非常感谢你的代码!我有一个问题。如果我想返回num1=1的所有字符串,例如字符串s=map.get(新对(1,i)),其中我从for循环开始,从0到3200进行迭代。有没有更好的方法来实现这一点?您必须以任何一种方式进行循环,因为您需要整个列表的一个子集。但是,也许可以使用2D
sparseArray
。Lemme检查。有可能,请参阅我的添加。谢谢,但是如何以零开始打印值?如何打印返回的对象?以下是代码:object obj=sparseArray.get(key);System.out.println(obj);这不是打印任何内容。谢谢!
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
    }
}
SparseArray<String> startingWithZero = sparseArray.get(0);
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);
    }
}