使用for循环用两个1D数组填充2D数组

时间:2019-09-12 08:44:41

标签: java arrays for-loop multidimensional-array

我必须从一个一维数组中制作一个二维数组,以便第一行充满arrayCentri中的数据。所有其他行是 充满arrayTocke。列数为arrayCentri.length(由arrayCentri中的元素数决定列数),行数应为(arrayTocke.length / arrayCentri.length)+1(因为第一行是来自arrayCentri的数据)。数组的列将代表群集。列的第一个元素将是群集的中心,列的所有其他元素将是群集的点。

我的想法是使用for循环,因此我要遍历两个数组arrayCentri和arrayTocke并遍历clusterji,但是我不明白...

public static void main(String[] args) {
    String[] arrayCentri= {"center1","center2","center3"};
    String[] arrayTocke= {"tocka1","tocka2","tocka3","tocka4","tocka5","tocka6","tocka7","tocka8","tocka9", "tocka10"};
    String[][] clusterji = new String[((arrayTocke.length/arrayCentri.length) +1)][arrayCentri.length]; 

    for (int col = 0; col < clusterji.length; col++) {
        for (int row = 0; row < clusterji[0].length; row++) { // why clusterji[0].length? //
            for(int i=0; i< arrayCentri.length; i++) {
                for (int j=0; j< arrayTocke.length; j++) {
            clusterji[0][row]= arrayCentri[i]; // First row is filled with array centri //
            clusterji[1][0]= arrayTocke[j]; // From second row there should be filled with arrayTocke //

       }
      }
     }
    }

for(int i=0; i<clusterji.length; i++)
{
    for(int j=0; j<clusterji[0].length; j++)
        System.out.print(clusterji[i][j]+ " ");
    System.out.println();

}
}

 }

结果是:

center3 center3 center3 
tocka10 null null 
null null null 
null null null 

我得到正确的列数,但行和数据不正确。应该看起来像这样:

center1 center2 center3
tocka1 tocka2 tocka3
tocka4 tocka5 tocka6
tocka7 tocka8 tocka9
tocka10

那我在哪里弄错了?

2 个答案:

答案 0 :(得分:1)

我建议您从arrayTocke复制每三个字符串,并使用Array.copyOfRange(originalArray, int from, int to)填充2D数组的行

public static void main(String[] args) {
    String[] arrayCentri= {"center1","center2","center3"};
    String[] arrayTocke= {"tocka1","tocka2","tocka3","tocka4","tocka5","tocka6","tocka7","tocka8","tocka9", "tocka10"};

    int rows     = arrayTocke.length/arrayCentri.length + (arrayTocke.length%arrayCentri.length == 0 ? 1 : 2);
    int columns  = arrayCentri.length;
    int rowCount = 0;

    String[][] clusterji  = new String[rows][columns];
    clusterji[rowCount++] = arrayCentri;
    for(int i=0;i < arrayTocke.length; i += columns){
        clusterji[rowCount++] = Arrays.copyOfRange(arrayTocke, i, Math.min(arrayTocke.length,i+columns));
    } 
    Arrays.stream(clusterji).forEach(row->{System.out.println(Arrays.toString(row));});
}

OR

使用流

    public static void main(String[] args) {
    String[] arrayCentri= {"center1","center2","center3"};
    String[] arrayTocke= {"tocka1","tocka2","tocka3","tocka4","tocka5","tocka6","tocka7","tocka8","tocka9", "tocka10"};
    //concat both arrays to one to get {"center1","center2","center3","tocka1","tocka2" ..."tocka10"}
    String[] centriAndTocke = Stream.concat(Arrays.stream(arrayCentri), Arrays.stream(arrayTocke)).toArray(String[]::new);

    int columns  = arrayCentri.length;        
    String[][] clusterji = IntStream.iterate(0, i -> i + columns)
                                .limit((long) Math.ceil((double) centriAndTocke.length / columns))
                                .mapToObj(j -> Arrays.copyOfRange(centriAndTocke, j, Math.min(centriAndTocke.length, j+columns)))
                                .toArray(String[][]::new);        
    Arrays.stream(clusterji).forEach(row->{System.out.println(Arrays.toString(row));});
}

答案 1 :(得分:1)

我认为您已经使这项任务复杂化了。您可以将数组映射到列表中,并使用列表API减少用于同一任务的代码。而且,如果您拖入GuavaApache Commons中的任何一个,它们都支持将一个列表分为许多列表,这正是您想要做的。

这里有两个例子。首先是使用普通的Java API和数组复制。第二个是使用番石榴的分区。


package test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import org.junit.Test;
import com.google.common.collect.Lists;

public class ArrayTest {

  @Test
  public void twoArrayCopyRangeTest() {

    String[] centri = {"center1","center2","center3"};
    String[] tocke = {"tocka1","tocka2","tocka3","tocka4","tocka5","tocka6","tocka7","tocka8","tocka9", "tocka10"};
    List<String[]> splitList =  new ArrayList<>();
    splitList.add(centri);
    int splitIndex = 0;

    while (splitIndex < tocke.length) {
      splitList.add(Arrays.copyOfRange(tocke, splitIndex, centri.length + splitIndex));
      splitIndex = splitIndex + centri.length;
    }

    splitList.forEach(l -> {
      System.out.println(Arrays.stream(l).collect(Collectors.joining(",")));
     });

  }

  @Test
  public void twoArrayPartitionTest() {

    String[] centri = {"center1","center2","center3"};
    String[] tocke = {"tocka1","tocka2","tocka3","tocka4","tocka5","tocka6","tocka7","tocka8","tocka9", "tocka10"};

    List<String> splitList =  new ArrayList<>();
    splitList.addAll(Arrays.asList(centri));
    splitList.addAll(Arrays.asList(tocke));

    List<List<String>> partition = Lists.partition(splitList, centri.length);
    partition.forEach(l -> System.out.println(l.stream().collect(Collectors.joining(":"))));

  }
}