2013-07-09 95 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) { 
     } 
    } 
} 
相關問題