有没有一种方法可以在Java中拆分for循环来为值做不同的事情?

时间:2019-05-09 18:26:33

标签: java for-loop

初学者问题:在Java中是否可以拆分循环? 例如下面的内容,我想拆分

    for(int i=0; i<bucket.size(); i++){
        do something 
    }

比方说bucket.size = 10 一分为二。

  1. 为存储桶中的前9个值做一些事情

  2. 为存储桶中的最后一个值做某事

7 个答案:

答案 0 :(得分:3)

最直接:

for(int i=0; i<bucket.size()-1; ++i){
    do something 
}
do something else

使用List.sublist

for (Buck buck : bucket.subList(0, bucket.size()-1)) {
    do something
}
// (Might want to check exists...)
Buck buck = bucket.get(bucket.size()-1);
do something else

答案 1 :(得分:1)

for (int i=0; i<bucket.size()-1; i++){
    if (i < 9)
    {
    //DO
    } 
    else if (i == bucket.size()-2) 
    //-2 because the loop condition is < not <= but also includes a -1
    //Only works with bucket size 11 or greater or it will just enter the i< 9 instead
    {
    //DO for final time in loop
    } 
}

只需在块中使用其他条件即可找到所需的内容。

您可以将&&用于AND,将||用于OR,然后将< > <= >= ==

尽管您的循环

    int size = 10;
    for (int i=0; i<=size-1; i++){

    }

如果您希望循环执行10次。

答案 2 :(得分:1)

如果您使用的是LinkedList,则可以调用removeLast方法,该方法将删除并返回最后一个元素。

LinkedList<Integer> bucket= new LinkedList<>();
int last = bucket.removeLast();

// do something with the last item here

for (Integer i : bucket) {
// Do something for all items except the last one            
}

答案 3 :(得分:1)

我会使用while循环

private void InsertRecords(string fileName)
{
            var user = userRepository.GetCurrentUser();

            try
            {
                foreach (DataRow row in dt.Rows)
                {
                    string zipCode = FormatZipcode.Format(row[9].ToString());

                    db.Locations.Add(new Location
                    {
                        UserId = user.Id,
                        LocationName = row[0].ToString() ?? "",
                        LocationId = row[1].ToString() ?? "",
                        LocationType = row[2].ToString() ?? "",
                        DistributionCenter = row[3].ToString() ?? "",
                        OpenDate = row[4].ToString() ?? "",
                        Address1 = row[5].ToString() ?? "",
                        Address2 = row[6].ToString() ?? "",
                        City = row[7].ToString() ?? "",
                        State = row[8].ToString() ?? "",
                        Zipcode = zipCode ?? "",
                        Country = row[10].ToString() ?? "",
                        FileName = fileName ?? "",
                        Date = System.DateTime.Now
                    });
                }
                db.SaveChanges();
            }
            catch (Exception e)
            {
                Debug.WriteLine(e.Message);
                throw;
            }

}

答案 4 :(得分:0)

如果只想对最后一个值做某事,那就去做。这将假定OP声明了一个非空列表。

  // Doing something for first size-1 values.
  for(int i=0; i<bucket.size()-1; i++){
      //  do something with
      bucket.get(i);
  }
  // Now do something with last value.
  bucket.get(bucket.size()-1);

答案 5 :(得分:0)

嗯,有很多方法可以帮助您实现这一目标。如果您只是想对最后一个元素进行something else,对其他元素进行something,我想您应该这样做:

    int lastIndex = bucket.size() - 1;
    for (int i = 0; i < lastIndex; i++) {
        Type item = bucket.get(i);
        //do something with item
    }
    if(lastIndex != -1) {
        Type item = bucket.get(lastIndex);
        // do something else with item
    }

这样,您可以避免每次进行比较并节省一次迭代(我知道这不是很大的优势)。

尽管,如果您的列表确实很大并且您需要一种有效的方法,或者甚至用例更加复杂,则应考虑使用Spliterators

https://www.baeldung.com/java-spliterator

答案 6 :(得分:0)

您可以利用skip中的limitStream方法

 //first 9 elements
 bucket.stream().limit(9).forEach(s -> {
        //do smth
 });

 //remaining elements
 bucket.stream().skip(9).forEach(s -> {
        //do smth
 });