Java 在这种情况下,我可以避免嵌套for循环吗?

Java 在这种情况下,我可以避免嵌套for循环吗?,java,Java,对于每个用户,我都会获取与该用户对应的名称,对于每个获取的名称,都有一个相应的列表 我已尝试使用以下独立程序复制示例: 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

对于每个用户,我都会获取与该用户对应的名称,对于每个获取的名称,都有一个相应的
列表

我已尝试使用以下独立程序复制示例:

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) {

    }

}
package-com;
导入java.util.ArrayList;
导入java.util.List;
公开课考试{
公共静态void main(字符串参数[]){
列表用户=新建ArrayList();
用户。添加(“用户101”);
添加(“adminuser”);
for(字符串用户:用户){
试一试{
ArrayList namesCorrespondingtoUser=getNamesCorrespondingtoUser(用户);
for(字符串Id:namesCorrespondingtoUser){
列表项=getItemsCorrespondingtoId(用户,Id);
过滤器(项目、用户);
}
}捕获(例外e){
}
}
}
公共静态数组列表getNamesCorrespondingtoUser(字符串用户名)
抛出异常{
ArrayList name=新的ArrayList();
if(userName.equals(“user101”)){
名称。添加(“UBSC1”);
名称。添加(“HDBG1”);
名称。添加(“GHYU1”);
}
if(userName.equals(“adminuser”)){
名称。添加(“UBSC1”);
名称。添加(“HDBG1”);
名称。添加(“GHYU1”);
}
返回姓名;
}
公共静态列表getItemsCorrespondingtoId(字符串用户名,
字符串Id)引发异常{
返回null;
}
专用静态无效筛选器(列表项、字符串用户){
}
}
我很担心,因为for循环中有for循环。


请告诉我这是否可以改进。

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

我看不出内部循环有任何问题,因为它只会在极少数情况下执行。在教育中,你有时会觉得,所有比O(n*log(n))更糟糕的事情都是不好的,但在现实世界中,你很少会对O(n²)有任何问题

但是还有一些事情你可以尝试改进

1.:在
ArrayList getNamesCorrespondingtoUser(字符串用户名)
中,您依赖于硬编码的用户名。最好将别名读/存储在某个地方,否则每次名称更改时都必须触摸代码


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

首先,正如其他人提到的,双循环本身似乎不是问题。有一些替代方法,您可以在使用内存和速度之间进行权衡。一种方法是使用表格表示法,就像处理数据库一样,只编写一个表格来循环表“行”。下面是重写
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) {
        }
    }
}
publicstaticvoidmain(字符串参数[]){
列表用户=新建ArrayList();
add(新字符串[]{“user101”,“UBSC1”});
add(新字符串[]{“user101”,“HDBG1”});
add(新字符串[]{“user101”,“GHYU1”});
add(新字符串[]{“adminuser”,“UBSC1”});
添加(新字符串[]{“adminuser”,“HDBG1”});
add(新字符串[]{“adminuser”,“GHYU1”});
for(字符串[]用户:用户){
试一试{
列表项=getItemsCorrespondingtoId(用户[0],用户[1]);
过滤器(项目,用户[0]);
}捕获(例外e){
}
}
}

你为什么担心?嵌套循环非常好,在您的情况下,似乎是正确的方法。如果您在此处使用Map(将id和用户存储在同一数据结构中),而不是使用两个列表,则可以避免这种循环嵌套。但在我看来,这种方法也很好,是否更适合这些问题?这个问题似乎离题了,因为它是关于改进工作程序的。更糟糕的是,抛出异常是捕获异常而不是处理它。这是一个无声失败的邀请。没错,在这种情况下,你必须捕捉异常,因为从外部看,它是你所看到的一切。这可能是一个评论。