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