Array of Strings into an ArrayList of Arraylist

This question already has an answer here:

  • Create ArrayList from array 32 answers

  • public static void main(String[] args) {
        String[] sentences = {"hello", "how are you", "i am fine", "and you ?", "thank you"};
        System.out.println(split(2,sentences));
        System.out.println(split(3,sentences));
    }
    
    public static List<List<String>> split(int numberOfElements, String[] sentences) {
        List<List<String>> lists = new ArrayList<List<String>>();
        int index = 0;
        for (String sentence : sentences) {
            if (index % numberOfElements == 0) {
                lists.add(new ArrayList<String>());
            }
            lists.get(index / numberOfElements).add(sentences[index]);
            index++;
        }
        return lists;
    }
    

    输出:

    [[hello, how are you], [i am fine, and you ?], [thank you]]
    [[hello, how are you, i am fine], [and you ?, thank you]]
    

    public static void main(String[] args) {
       String[] sentences = { "hello", "how are you", "i am fine", "and you ?", "thank you" };
    
       List<List<String>> convertIntoList = convertIntoList(sentences, 2);
       System.out.println(convertIntoList);
    
       convertIntoList = convertIntoList(sentences, 3);
       System.out.println(convertIntoList);
    }
    
    
    private static List<List<String>> convertIntoList(String[] sentences, int nbElement) {
       List<List<String>> listOfListTarget = new ArrayList<List<String>>();
       int currentIndex = 0;
    
       while (currentIndex < sentences.length) {
    
        int nextIndex = currentIndex + nbElement;
        if (nextIndex > sentences.length) {
          nextIndex = sentences.length;
        }
        final String[] copyOfRange = Arrays.copyOfRange(sentences, currentIndex, nextIndex);
        List<String> subList = new ArrayList<String>();
        subList.addAll(Arrays.asList(copyOfRange));
        listOfListTarget.add(subList);
        currentIndex+=nbElement;
      }
      return listOfListTarget;
    }
    

    Is this is a homework?

    So you have an array of strings, and you want to create a List> with that, with each inner List containing at most x number of elements.

    To get x number of elements and put them in a List, you can do a simple for loop.

    String[] myStringArray = { ... };
    List<String> myListOfString = new ArrayList<>();
    for(int i=0; i<x; i++) {
        myListOfString.add(myStringArray[i]);
    }
    

    So for example if you have these values

    String[] myStringArray = {"a", "b", "c", "d", "e"};
    x = 2;
    

    You'll get the following list using the above loop:

    ["a", "b"]
    

    Great! But we need to get all the contents of the myStringArray ! How do we do that? Then let's do the first step, we iterate through all the contents of the array. We can do that like this.

    int i=0; 
    while(i < myStringArray.length) {
        System.out.println(myStringArray[i]);
        i++;
    }
    

    Which will output:

    a
    b
    c
    d
    e
    

    This doesn't solve the problem... but at least we know how to iterate the whole thing. The next step is to get x of them. Sounds simple right? So basically we need to create a list of x from the contents. Maybe we can use the logic we created a few examples back to solve the problem.

    // Create list of list of string here
    int i = 0;
    while(i < myStringArray.length) {
      // Create list of string here
      for(int j=0; j<x; j++) {
          // Add myStringArray[j] to list of string here
      }
      // Add the list of string to the list of list of string here
      i++;
    }
    

    Easy right? No. This gives the following lists:

    ["a", "b"]
    ["a", "b"]
    ["a", "b"]
    ["a", "b"]
    ["a", "b"]
    

    Why? In the first loop, we are iterating up to how many is in the array. In the second loop, we are adding element 0 and 1 to a list. Obviously it wouldn't work. The second loop needs to be aware that it should not add previously added elements, and at the same time the first loop needs to be aware of what the second loop is doing. So you might think, maybe we can use the int i to indicate where the second loop should start?

    int i = 0;
    while(i<myStringArray.length) {
        while(i<x) {
            // add myStringArray[i];
            i++;
        }
        i++;
    }
    

    Unfortunately, using the same values as previous, this will only give the following list

    ["a", "b"]
    

    Because i is iterating through the whole array. So when it goes from 0 to length, whatever the value of i is used on the second array. When it loops again, i becomes 1, so the start of the second loop is at 1.

    We need a separate variable to do the counting, while still keeping in mind where we currently are in the second loop.

    int i = 0;
    while(i<myStringArray.length) {
        int count = 0;
        while(count < x) {
            // Add myStringArray[count+i] to list of string
            count++;
        }
        // Add to list of list of string
        i += count + 1; // Need to be aware of how much we have processed
    }
    

    This will do what we want, but unfortunately we can get in trouble at certain values. Say x is 10 and myStringArray is only of length 2. This will throw an exception because when it reaches the point of count+i = 3, that index doesn't exist anymore. The second loop also needs to be aware of how much is still remaining.

    Finally we'll have the following code

    int i = 0;
    while(i<myStringArray.length) {
        int count = 0;
        while(count < x && count+i < myStringArray.length) {
            // Add myStringArray[count+i] to list of string
        }
        // Add to list of list of string
        i += count; // Need to be aware of how much we have processed
    }
    

    Which will give

    ["a", "b"]
    ["c", "d"]
    ["e"]
    

    Edit: Next time try to put some code that you tried something.

    链接地址: http://www.djcxy.com/p/17648.html

    上一篇: 如何将数组转换为ArrayList?

    下一篇: Arraylist的ArrayList中的字符串数组