2013-07-09 57 views
0

对于每个用户,我提取对应于该用户的名称,并为每个提取的名称提供相应的List在这种情况下,我可以避免嵌套for循环吗?

我试图复制使用此之下独立程序的示例:

package com; 

import java.util.ArrayList; 
import java.util.List; 

public class Test { 

    public static void main(String args[]) { 
     List<String> users = new ArrayList<String>(); 
     users.add("user101"); 
     users.add("adminuser"); 

     for (String user : users) { 
      try { 
       ArrayList<String> namesCorrespondingtoUser = getNamesCorrespondingtoUser(user); 
       for (String Id : namesCorrespondingtoUser) { 

        List<String> Items = getItemsCorrespondingtoId(user, Id); 

        filter(Items, user); 
       } 
      } catch (Exception e) { 
      } 
     } 
    } 

    public static ArrayList<String> getNamesCorrespondingtoUser(String userName) 
      throws Exception { 
     ArrayList<String> names = new ArrayList<String>(); 
     if (userName.equals("user101")) { 
      names.add("UBSC1"); 
      names.add("HDBG1"); 
      names.add("GHYU1"); 
     } 
     if (userName.equals("adminuser")) { 
      names.add("UBSC1"); 
      names.add("HDBG1"); 
      names.add("GHYU1"); 
     } 
     return names; 

    } 

    public static List<String> getItemsCorrespondingtoId(String userName, 
      String Id) throws Exception { 

     return null; 
    } 

    private static void filter(List<String> Items, String user) { 

    } 

} 

我很担心,因为有一个用于内部循环的循环。

请让我知道,如果这可以改善任何方式。

+7

您为什么担心?嵌套循环非常好,在你的情况下,似乎是正确的方法。 – Carsten

+0

如果您在这里使用Map(将ID和用户存储在相同的数据结构中),而不是使用两个列表,那么您可以避免此循环嵌套。但这种方式在我看来也很好 – Freak

+1

也许,http://codereview.stackexchange。 com /更适合这些问题? – zEro

回答

1

看起来没问题,只是我建议在数据库表中提供用户名和相应的ID,而不是硬编码。

+0

这可能是一条评论。 – zEro

2

我没有看到任何内部循环的问题,因为它只会在极少数情况下执行。在教育中,你会得到某种感觉,即比O(n * log(n))更差的感觉是不好的,但在现实世界中,你很少遇到O(n 2)的问题。

但还有一些其他的事情可以尝试改进。

1 .:在ArrayList<String> getNamesCorrespondingtoUser(String userName)中,您依赖于硬编码的用户名。在别处读取/存储别名会更好,否则每次名称更改时都必须触摸代码。

2 .:投掷Exception通常不是一个好主意,因为它是所有异常的基类,您无法区分实际抛出的异常。很难在该函数上建立任何错误处理。

+2

更糟糕的是,抛出异常,是捕捉异常,而不是处理它。这是对无声失败的邀请。 – Tarik

+0

准确地说,你必须在这种情况下捕捉异常,因为从外面看它就是你所看到的。 – ssindelar

0

首先,和其他人一样,双循环本身并不是一个问题。还有其他一些方法可能会影响内存的使用速度。可以使用表格表示法,就像处理数据库一样,并且只写一个循环遍历表“行”。以下是您如何重写main()方法的方法:

public static void main(String args[]) { 
    List<String[]> users = new ArrayList<String[]>(); 
    users.add(new String[]{"user101", "UBSC1"}); 
    users.add(new String[]{"user101", "HDBG1"}); 
    users.add(new String[]{"user101", "GHYU1"}); 
    users.add(new String[]{"adminuser", "UBSC1"}); 
    users.add(new String[]{"adminuser", "HDBG1"}); 
    users.add(new String[]{"adminuser", "GHYU1"}); 

    for (String[] user : users) { 
     try { 
       List<String> Items = getItemsCorrespondingtoId(user[0], user[1]); 

       filter(Items, user[0]); 
     } catch (Exception e) { 
     } 
    } 
} 
相关问题