我的for循环太长了。作为演示,方法B有三个for循环。有没有办法可以将它减少为一个简短的for循环(一个循环)?感谢
public class MyMates
{
private static TreeSet<String> myTable = new TreeSet<String>();
private static String[] names1 = null;
private static String[] names2 = null;
private static String[] names3 = null;
public MyMates()
{
super();
myTable = new TreeSet<String>();
}
public static String methodA(String aTemp)
{
String[] names1 = new String[] {"Amy", "Jose", "Jeremy", "Alice", "Patrick"};
String[] names2 = new String[] { "Alan", "Amy", "Jeremy", "Helen", "Alexi"};
String[] names3 = new String[] { "Adel", "Aaron", "Amy", "James", "Alice" };
return aTemp;
}
public static String methodB(String bTemp)
{
for (int i = 0; i < names1.length; i++) {
myTable.add(names1[i]);
}
System.out.println(myTable);
for (int i = 0; i < names2.length; i++) {
myTable.add(names2[i]);
}
System.out.println(myTable);
for (int i = 0; i < names3.length; i++) {
myTable.add(names3[i]);
}
System.out.println(myTable);
return bTemp;
}
在这里输入代码
答案 0 :(得分:9)
实际上,你不需要任何for循环:
myTable.addAll(Arrays.asList(names1));
myTable.addAll(Arrays.asList(names2));
myTable.addAll(Arrays.asList(names3));
答案 1 :(得分:8)
当你有这样的东西时(伪代码):
doA(x);
doB(x);
doC(x);
doA(y);
doB(y);
doC(y);
你经常(虽然不总是)提取doA/doB/doC
并重构为这样的方法doABC
:
void doABC(o) {
doA(o);
doB(o);
doC(o);
}
然后你去其他地方:
doABC(x);
doABC(y);
这称为extract method refactoring。
从1.5开始,为Iterable
的数组和实例添加for-each循环。这是一个简单的例子:
String[] names = { "Alice", "Bob", "Carol" };
for (String name : names) {
System.out.println(name);
}
// "Alice", "Bob", "Carol"
引用 Effective Java 2nd Edition,第46项:首选for-each
循环到传统的for
循环:
1.5版中引入的
for-each
循环消除了混乱 以及隐藏迭代器或索引变量的错误机会 完全。由此产生的习语同样适用于集合和数组:// The preferred idiom for iterating over collections and arrays for (Element e : elements) { doSomething(e); }
当您看到冒号(:)时,请将其读作“in”。因此,上面的循环读作为 “对于元素中的每个元素
e
。”请注意,没有性能损失 使用for-each
循环,甚至是数组。事实上,它可能会提供轻微的 在某些情况下,优于普通for
循环的性能优势 只计算一次数组索引的限制。
for-each
循环不适用于所有情况,但是当它出现时,您应该始终尝试使用它来提高可读性并最大限度地减少出错的可能性。
Collection.addAll
Collection<E>
定义addAll(Collection<? extends E>
,可用于将所有元素从一个Collection
添加到另一个{假设它是类型安全的。)
此外,Arrays.asList(T...)
可以创建一个由引用数组(而不是原语!)支持的List
。
这意味着在这种情况下你可以这样做:
myTable.addAll(Arrays.asList(names1));
myTable.addAll(Arrays.asList(names2));
myTable.addAll(Arrays.asList(names3));
请注意,常见的陷阱是通过,例如: int[]
到Arrays.asList
,希望获得List<Integer>
。这不起作用,因为虽然int
可以通过Integer
自动执行,但int[]
NOT 可以通过Integer[]
自动执行。
你写了以下内容:
public class MyMates {
private static String[] names1 = null;
private static String[] names2 = null;
private static String[] names3 = null;
public static String methodA(String aTemp) {
String[] names1 = ...;
String[] names2 = ...;
String[] names3 = ...;
return aTemp;
}
需要说明methodA
中的作业是本地声明的变量names1
,names2
,names3
,它们会遮盖具有相同名称的字段。这些变量超出methodA
末尾的范围,因此几乎没有用处。
这通常不是你想要的。您可能打算分配到字段,即:
public static String methodA(String aTemp) {
names1 = ...;
names2 = ...;
names3 = ...;
return aTemp;
}
答案 2 :(得分:6)
实施方法addNames(String[] names)
并将其调用3次。
答案 3 :(得分:4)
使用二维数组和两个嵌套循环的替代方法 (我不理解方法A / B中的参数和返回值)
public class MyMates {
private static TreeSet<String> myTable = new TreeSet<String>();
private static String[][] names;
public MyMates() {
super();
myTable = new TreeSet<String>();
}
public static String methodA(String aTemp) {
names = new String[][] {
{ "Amy", "Jose", "Jeremy", "Alice", "Patrick" },
{ "Alan", "Amy", "Jeremy", "Helen", "Alexi" },
{ "Adel", "Aaron", "Amy", "James", "Alice" } };
return aTemp;
}
public static String methodB(String bTemp) {
for (int row = 0; row < names.length; row++) {
for (int i = 0; i < names[row].length; i++) {
myTable.add(names[row][i]);
System.out.println(myTable);
}
}
return "";
}
public static void main(String[] args) {
methodA("");
methodB("");
}
}
答案 4 :(得分:3)
为什么不使用二维阵列?
String[][] names = { {"Amy", "Jose", "Jeremy", "Alice", "Patrick"},
{ "Alan", "Amy", "Jeremy", "Helen", "Alexi"},
{ "Adel", "Aaron", "Amy", "James", "Alice" } };
public static String methodB(String bTemp)
{
for (String[] namesarray : names)
{
for (String name : namesarray)
{
myTable.add(name);
}
}
return bTemp;
}
P.S。 methodA()/ methodB()语法很奇怪....如果多次调用methodA()或methodB(),或者在methodA()和methodB()之前使用myTable,你会让自己开错。两人都叫了。
答案 5 :(得分:1)
如果只想要一个for循环,可以先创建一个包含names1,names2和names3的数组(或列表)。
然后你只需循环这个新的数组/列表。
注意:在每个新实例(在构造函数中)重置myTable static 很奇怪......
答案 6 :(得分:0)
制作双循环:
String [] [] tableArray = new String [] [] {names1, names2, names3}
for (int i = 0; i<tableArray.length; i++){
for (int j = 0; j < tableArray[i].length; j++) {
myTable.add(tableArray[i][j]);
} }
或者你可以通过一个循环为你的家庭作业执行更好的算法,将O(n^3)
复杂度降低到O(max(names1.length, names2.length, names3.length))
放置条件和标志。