我的for循环相当长 - java

Dis*_*ude 2 java

我的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;
   }
Run Code Online (Sandbox Code Playgroud)

在此处输入代码

Mau*_*rry 9

实际上,你不需要任何for循环:

myTable.addAll(Arrays.asList(names1));
myTable.addAll(Arrays.asList(names2));
myTable.addAll(Arrays.asList(names3));
Run Code Online (Sandbox Code Playgroud)


pol*_*nts 8

关于提取方法的重构

当你有这样的东西(在伪代码中):

doA(x);
doB(x);
doC(x);

doA(y);
doB(y);
doC(y);
Run Code Online (Sandbox Code Playgroud)

你可以经常(虽然不总是)提取doA/doB/doC和重构为这样的方法doABC:

void doABC(o) {
  doA(o);
  doB(o);
  doC(o);
}
Run Code Online (Sandbox Code Playgroud)

然后在其他地方你做:

doABC(x);
doABC(y);
Run Code Online (Sandbox Code Playgroud)

这称为提取方法重构.


在for-each循环中

从1.5开始,为数组和实例添加for-each循环Iterable.这是一个简单的例子:

    String[] names = { "Alice", "Bob", "Carol" };
    for (String name : names) {
        System.out.println(name);
    }
    // "Alice", "Bob", "Carol"
Run Code Online (Sandbox Code Playgroud)

Effective Java 2nd Editionfor-eachfor引用,第46项:首选循环到传统循环:

for-each在1.5版中引入的循环通过完全隐藏迭代器或索引变量来消除混乱和错误的机会.由此产生的习语同样适用于集合和数组:

// The preferred idiom for iterating over collections and arrays
for (Element e : elements) {
    doSomething(e);
}
Run Code Online (Sandbox Code Playgroud)

当你看到冒号(:)时,将其读作"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));
Run Code Online (Sandbox Code Playgroud)

需要注意的是一个常见的问题是传递,例如一int[]Arrays.asList,并希望能得到List<Integer>.这是不行的,因为当一个int是autoboxable到Integer,一个int[] autoboxable到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;
   }
Run Code Online (Sandbox Code Playgroud)

它需要说的是,在分配methodA是在本地声明的变量names1,names2,names3即阴影具有相同名称的字段.这些变量最终超出了范围methodA,因此几乎没有任何目的.

这通常不是你想要的.您可能打算分配给字段,即:

   public  static String methodA(String aTemp) {
     names1 = ...;
     names2 = ...;
     names3 = ...;

     return aTemp;
   }
Run Code Online (Sandbox Code Playgroud)


Joa*_*uer 6

实现一个方法addNames(String[] names)并调用它3次.

这称为"提取方法"重构.