在2d数组列表中添加两次的术语



0

上下文:我正在尝试随机打乱一个2D数组列表。

例如,如果我有下面的2d数组列表(在任何一个方向上都可以一样长),我想根据输入索引将所有类似的值一起移动(例如,将所有b移动到它们各自数组的开头)。

[[a,b,c]                               [[b,c,a]
,[a,b,c]                ==>            ,[b,c,a]
,[a,b,c]]                              ,[b,c,a]]

我使用的方法有两个数据结构。将数据添加到新数据结构,并从旧数据结构中删除数据,直到所有垂直组都被打乱为止。

在我的第一次尝试中,我打乱了数组的顺序,而不是它们的内容。

我决定先在新的数据结构中只使用一组数据进行尝试,但它将项添加到所有数组中,尽管甚至没有多次运行代码行。

例如,如果上面的‘b’中的每一个的值为1,2,3而不是输出[1][2][3],则它输出[1,2,3][1,3][1,2,3]。我已经测试了每行代码的输出,它按计划进行,直到terms2shuffled.get(k).add(intermediateTerms.get(k).get(j));

我的代码:

ArrayList<ArrayList<String>> intermediateTerms = new ArrayList<>();
terms2shuffled = new ArrayList<>();

ArrayList<String> temp = new ArrayList();
for(int i = 0;i<columnNumber;i++){
terms2shuffled.add(temp);
}

intermediateTerms=terms2;            

int length = intermediateTerms.get(0).size();
int j = random.nextInt(length);
for(int k = 0; k<numColumns;k++){
System.out.println(intermediateTerms.get(k).get(j));
terms2shuffled.get(k).add(intermediateTerms.get(k).get(j));
System.out.println(terms2shuffled);
//intermediateTerms.remove(j);

(其中wordsNumber==行数NumColumns==列数)

感谢的帮助

以下代码行:

ArrayList<String> temp = new ArrayList();
for(int i = 0;i<columnNumber;i++){
terms2shuffled.add(temp);
}

为每一行添加相同的ArrayList实例,这意味着以下行:

terms2shuffled.get(k).add(intermediateTerms.get(k).get(j));

将修改该单个实例(因为terms2shuffled.get(k)总是给你temp),这应该解释为什么:

它将项添加到所有阵列

相反,您可以尝试:

for(int i = 0; i < columnNumber; i++) {
terms2shuffled.add(new ArrayList<>());
}

以便对于每一行具有单独的CCD_ 5实例。


在以下代码中:

intermediateTerms=terms2;

我假设terms2是原始的二维列表,所以我应该注意,通过稍后修改intermediateTerms,实际上也在修改terms2列表,因为它们都指向同一个实例。如果不想修改原始列表,则应创建其深度副本,然后将深度副本分配给intermediateTerms。由于terms2是二维的,一个简单的terms2.clone();是不够的。


以下for循环声明:

for (int k = 0; k < numColumns; k++)

使用k作为列的索引,但在循环的主体中,您使用k来获得二维List中的。既然你的二维List是正方形的,那么它根本不重要。我只是注意到了这一点。据我所知,这可能不会阻止人们将行解释为列,将列解释为行,所以我假设这里是最简单的情况,这就是我注意到这一点的原因。


如果我有下面的2d数组列表(在任何方向上都可以一样长),我想根据输入索引将所有类似的值一起移动(例如,将所有b移动到它们各自数组的开头)。

在给定的代码中,您似乎只做一个操作(即在每行中移动一列,而不是在每行移动多列)。相反,您可能希望多次重复该过程,例如(在伪代码中):

将terms2中的所有值深度复制到结果列表中。对于每列(名为"c"),重复:生成一个随机列(名为"r")以更改其在每行中的位置。对于(结果列表中的)每一行,重复:将列"c"替换为行中的"r">

但这似乎还不够,因为您将只在每行的基础上洗牌,这意味着例如,第二行的元素将始终保留在第二行中。即使在那之后你打乱了行,仍然有一些元素永远不会离开它们的行。相反,您可能希望在每个单元格的基础上进行混洗(稍后将在本文中提供这样的示例逻辑和代码)。


我正在尝试随机打乱2D数组列表。

对二维List中的所有值进行随机化的一种方法是:

  1. 将二维CCD_ 18压缩为一维
  2. 一维无序播放
  3. 从打乱的单个维度List重新创建维度

例如:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
public class ListUtils {

public static <T> void collapseFrom2D(final List<? extends List<T>> inputList2D,
final List<T> outputList1D) {
inputList2D.forEach(outputList1D::addAll);
}

public static <T> void setAll(final Iterator<T> inputIter,
final ListIterator<T> outputIter,
final long limit) {
for (long i = 0; outputIter.hasNext() && inputIter.hasNext() && i < limit; ++i) {
outputIter.next();
outputIter.set(inputIter.next());
}
}

public static <T> void setAll(final Iterator<T> inputIter,
final ListIterator<T> outputIter) {
setAll(inputIter, outputIter, Integer.MAX_VALUE);
}

public static <T> void expandTo2D(final Iterator<T> inputValuesIter,
final List<? extends List<T>> outputList2D) {
final Iterator<? extends List<T>> outputIter = outputList2D.iterator();
while (outputIter.hasNext())
setAll(inputValuesIter, outputIter.next().listIterator());
}

public static <T> void expandTo2D(final List<T> inputList1D,
final List<? extends List<T>> outputList2D) {
expandTo2D(inputList1D.iterator(), outputList2D);
}

public static <T> void shuffle2D(final List<? extends List<T>> list) {
final ArrayList<T> singleDimension = new ArrayList<>();
collapseFrom2D(list, singleDimension);
Collections.shuffle(singleDimension);
expandTo2D(singleDimension, list);
}

public static void main(final String[] args) {
final ArrayList<List<Integer>> list = new ArrayList<>();
list.add(Arrays.asList(1, 2));
list.add(Arrays.asList(3, 4, 5, 6));
list.add(Collections.emptyList());
list.add(Arrays.asList(7, 8, 9));
System.out.println("Before: " + list);
shuffle2D(list);
System.out.println("After: " + list);
}
}

据我所知,它可以推广到n维列表或数组。

上面给出的示例代码不必在方形List上运行。它也适用于非矩形CCD_ 22s。

最新更新