【问题标题】:Creating a list of arrays with positive and negative values from given set in Java从Java中的给定集合创建具有正值和负值的数组列表
【发布时间】:2017-12-19 15:50:54
【问题描述】:

假设我有以下集合A={1,2,3}

现在我想创建一个数组列表,使我的输出看起来像 (如果我们只允许 1 个负值) {-1,2,3}, {1,-2,3}, {1,2,-3}

(如果我们只允许 2 个负值) {-1,-2,3}, {-1,2,-3}, {1,-2,-3}

...等等。

到目前为止,我尝试了当我有 1 个负值时,它有效。 我使用了两个 for 循环,如下所示

ArrayList<ArrayList<Integer>> outer = new ArrayList<ArrayList<Integer>>();

for (int j=0; j<neighbours.size(); j++) 
{
    outer.add(createDnf(neighbours, neighbours.get(j)));
}

protected ArrayList<Integer> createDnf(List<Integer> others, int dn) {
    ArrayList<Integer> inner = new ArrayList<Integer>();
    for (int j=0; j<others.size(); j++) {
        if(others.get(j) == dn) {
            inner.add(dn);
        } else {
            inner.add(-others.get(j));
        }
    }
    return inner;
}

这里neighbours 包含与集合A 相同的整数列表。 如何使其适用于 2 个或更多负值?

谢谢!

【问题讨论】:

  • 当心,p over q 增长很快。示例:如果您的列表有 50 个元素 (p),并且您允许 6 个负值 (q),那么您的输出将有 (50*49*48*47*46*45)/(1*2*3*4*5 *6)=15,890,700 个值。
  • 想知道这是否是回溯算法的情况,从第一个元素开始,使其成为-ve,然后处理剩余的元素。

标签: java arrays arraylist


【解决方案1】:

我已经创建了下面的 sn-p,它只在你需要单个负数的情况下给出重复值,否则它工作正常:

import java.util.Set;
import java.util.HashSet;
import java.util.List;
import java.util.ArrayList;

public class MyClass {
    public static void main(String args[]) {
                        ArrayList<Integer> negativeIndexList = new ArrayList<Integer>();
                        negativeIndexList.add(1);
                        negativeIndexList.add(2);
                        negativeIndexList.add(3);
                        negativeIndexList.add(4);
                        negativeIndexList.add(5);
                        System.out.println(returnPositiveNegativeArray(negativeIndexList,2));



    }

    private static ArrayList<ArrayList<Integer>> returnPositiveNegativeArray(List<Integer> inputList,int noOfNegativesInEachList)    {
        ArrayList<ArrayList<Integer>> rList = new ArrayList<ArrayList<Integer>>();
        for(int index=0;index<inputList.size();index++)    {

            for(int j=index+1;j<inputList.size();j++)    {

                ArrayList<Integer> negativeIndexList = new ArrayList<Integer>();
                negativeIndexList.add(index);
                for(int k=j;k<inputList.size();k++)   {
                if(negativeIndexList.size()<noOfNegativesInEachList)    {
                                    negativeIndexList.add(k);

                }

            }
                if(negativeIndexList.size()==noOfNegativesInEachList)    {

                    ArrayList<Integer> innerList = new ArrayList<Integer>();
                    innerList.addAll(inputList);
                    for(int negativeIndex:negativeIndexList)    {
                        innerList.set(negativeIndex,-innerList.get(negativeIndex));
                    }
                                    rList.add(innerList);
                    }


            }

        }
        return rList;
    }
}

看看能不能帮到你..

【讨论】:

  • 感谢您的代码 sn-p。但是,它仅适用于noOfNegative=2。对于noOfNegative&gt;2,它不会返回完整列表。
  • 对于 3 个负数 ot 返回 [[-1, -2, -3, 4, 5], [-1, 2, -3, -4, 5], [-1, 2 , 3, -4, -5], [1, -2, -3, -4, 5], [1, -2, 3, -4, -5], [1, 2, -3, -4 , -5]] 对于 4 它给出 [[-1, -2, -3, -4, 5], [-1, 2, -3, -4, -5], [1, -2, - 3, -4, -5]] For 5 :[[-1, -2, -3, -4, -5]] 你认为缺少哪一组
  • 对于集合中的 3 个负数和 5 个元素,它应该有等于 10 的 5C3 元素。所以缺少的组合是:[-1, -2, 3, -4, 5] , [-1,-2,3,4,-5], [-1, 2, -3, 4, -5], [1, -2, -3, 4, -5]
  • 我真的不认为这是验证它的正确方法(尽管我非常不擅长这种排列和组合)。检查我发布的结果,让我知道缺少哪一组
猜你喜欢
  • 1970-01-01
  • 2017-02-20
  • 1970-01-01
  • 2021-01-28
  • 1970-01-01
  • 1970-01-01
  • 2017-11-11
  • 2015-11-01
  • 1970-01-01
相关资源
最近更新 更多