【问题标题】:If else statement inside a for loop[java]for循环中的if else语句[java]
【发布时间】:2015-05-19 10:47:07
【问题描述】:

我有一些这样的代码,将 Sting 转换为对象。但它在 for 循环中包含 if 语句,以指示第一个节点和最后一个节点。还有比这更好的编码吗?

splitQueue = "Man-1/Man-2/Man-3/Man-4".split("/");
QueueSplitLen = splitQueue.length;
Queue[] manArray = new Queue[QueueSplitLen];
for (int i = 0; i < QueueSplitLen; i++) {

    // first Man, no parent Queue
    if (i == 0) {
        Man newMan = new Man(splitQueue[0]);
        manArray[0] = new Queue(newMan, null);

        // last Man, be current Man
    } else if (i == QueueSplitLen - 1) {
        this.curMan = new Man(splitQueue[i]);
        this.parentQueue = manArray[i - 1];

        // one's parent is the previous one.
    } else {
        Man newMan = new Man(splitQueue[i]);
        manArray[i] = new Queue(newMan, manArray[i - 1]);
    }
}

【问题讨论】:

  • 您没有将最后一个Man 存储到manArray

标签: java if-statement for-loop coding-style open-closed-principle


【解决方案1】:

你可以处理循环外的第一个和最后一个节点:

    // first
    Man newMan = new Man(splitQueue[0]);
    manArray[0] = new Queue(newMan, null);
    // all the rest
    for (int i = 1; i < QueueSplitLen - 1; i++) {
        newMan = new Man(splitQueue[i]);
        manArray[i] = new Queue(newMan, manArray[i - 1]);
    }
    // last
    this.curMan = new Man(splitQueue[QueueSplitLen - 1]);
    this.parentQueue = manArray[QueueSplitLen - 2];

当然,这段代码假定数组中至少有两个元素。如果不是这样,则必须添加一些条件。

【讨论】:

    【解决方案2】:

    您可以在for 循环之外提取第一个和最后一个块并将中间部分留在那里。显然,您需要对提取的代码添加其他检查,主要是为了确保您至少有 1 个项目(第一个 if 条件)并且您有多个(最后一个 if 条件)。

        splitQueue = "Man-1/Man-2/Man-3/Man-4".split("/");
        QueueSplitLen = splitQueue.length;
        Queue[] manArray = new Queue[QueueSplitLen];
    
        if (manArray.length > 0) {
                Man newMan = new Man(splitQueue[0]);
                manArray[0] = new Queue(newMan, null);
                // last Man, be current Man
            }
    
        for (int i = 1; i < QueueSplitLen - 1; i++) {                       
                this.curMan = new Man(splitQueue[i]);
                this.parentQueue = manArray[i - 1];                
        }
    
        // one's parent is the previous one.
             if(manArray.length > 1) {
                Man newMan = new Man(splitQueue[manArray.length]);
                manArray[manArray.length] = new Queue(newMan, manArray[manArray.length - 2]);
            }
    

    话虽如此,这可能会降低代码的可读性,因此最好保持原样。

    【讨论】:

      【解决方案3】:

      编码的另一种选择是对每种情况使用不同的方法,例如:

      retrieveManFromQueue(splitQueue);
      retrieveLastManFromQueue(splitQueue);
      retrieveOther(splitQueue);
      

      当然,这需要一些“微调”,以便找到一种存储每种方法计算出的“结果”的好方法。

      【讨论】:

        【解决方案4】:

        使用此代码:

        String[] splitQueue = "Man-1/Man-2/Man-3/Man-4".split("/");
        
        for( String elem: splitQueue ){
          System.out.println(elem);         
        }
        

        我得到这个结果:

        Man-1 Man-2 Man-3 Man-4

        对第一个和最后一个元素进行不同处理的实际目的是什么,因为它们将位于新数组中的同一位置。

        String[] splitQueue = "Man-1/Man-2/Man-3/Man-4".split("/");
        List<NewObject> myList = new ArrayList<newObject>();
        
        for( String elem: splitQueue ){
          myList.add(new Object(elem));         
        }
        

        myList.get(0) 是第一个元素
        muList.get(myList.size()-1) 是最后一个元素

        您应该通过迭代读取String[]这一事实,因此新列表将被迭代填充。

        我是否遗漏了一些你可以给我们一些精确度的东西?

        我猜你正在使用一种“序列化”集合(不适用于 Set)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-02-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-10-28
          相关资源
          最近更新 更多