【问题标题】:Generating all possible positions of item by snippet from List从列表中按片段生成项目的所有可能位置
【发布时间】:2019-05-14 01:44:55
【问题描述】:

我有这门课

public class Operation {

  private double value;
  private boolean inc;

  public Operation(double value, boolean inc) {
    this.value = value;
    this.inc = inc;
  }

  public double getValue() {
    return value;
  }

  public void setValue(double value) {
    this.value = value;
  }

  public boolean isInc() {
    return inc;
  }

  public void setInc(boolean inc) {
    this.inc = inc;
  }

  @Override
  public String toString() {
    return "Operation{" + "value=" + value + ", inc=" + inc + '}';
  }

}

现在我有了这个列表

public class TestOperation {

  public static void main(String[] args) {
    List<Operation> listOperation1 = new ArrayList<>();
    listOperation1.add(new Operation(1.3, true));
    listOperation1.add(new Operation(2.7, true));
    listOperation1.add(new Operation(0.9, false));
    listOperation1.add(new Operation(0.8, false));

    //Generate posible Rotation listOperation1
    //Operation(1.3, true), Operation(2.7, true), Operation(0.9, false), Operation(0.8, false)
    //Operation(1.3, true), Operation(2.7, true), Operation(0.8, false), Operation(0.9, false)
    //Operation(2.7, true), Operation(1.3, true), Operation(0.9, false), Operation(0.8, false)
    //Operation(2.7, true), Operation(1.3, true), Operation(0.8, false), Operation(0.9, false)

    List<Operation> listOperation2 = new ArrayList<>();
    listOperation2.add(new Operation(1.5, true));
    listOperation2.add(new Operation(2.9, true));
    listOperation2.add(new Operation(4.6, true));

    //Generate posible Rotation listOperation2
    //Operation(1.5, true), Operation(2.9, true), Operation(4.6, true)
    //Operation(1.5, true), Operation(4.6, true), Operation(2.9, true)
    //Operation(2.9, true), Operation(4.6, true), Operation(1.5, true)
    //Operation(2.9, true), Operation(1.5, true), Operation(4.6, true)
    //Operation(4.6, true), Operation(2.9, true), Operation(1.5, true)
    //Operation(4.6, true), Operation(1.5, true), Operation(2.9, true)
  }

}

旋转只发生在inc = trueinc = false之间,不混合! inc = true 的项目数可以与 inc = false 不同。甚至,有些可能不存在。

列表中所有提交的项目都必须处理,不能丢失,但不能重复(像对象,而不是像值)。

如何产生这种旋转?

【问题讨论】:

  • 如果输入像[true, false, true, false, true, false]会发生什么?
  • @Holger,我忘记了这种情况,因为我之前订购过,先是true,然后是false
  • 那么应该怎么办呢?或者您的任务是否意味着在轮换之前进行排序?
  • @Holger 没关系,true 只需要和true 一起订购,falsefalse 一起订购,这不会改变情况。
  • 然后,在问题中添加一个示例,说明接下来会发生什么。

标签: list java-8 java-stream permutation


【解决方案1】:
public class JavaApplication7 {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        List<Operation> listOperation1 = new ArrayList<>();
        listOperation1.add(new Operation(1.3, true));
        listOperation1.add(new Operation(2.7, true));
        listOperation1.add(new Operation(0.9, false));
        listOperation1.add(new Operation(0.8, false));

        List listOperationTrue = listOperation1.stream()
                .filter(operation -> operation.isInc())
                .collect(Collectors.toList());

        List listOperationFalse = listOperation1.stream()
                .filter(operation -> !operation.isInc())
                .collect(Collectors.toList());

        List<List<Operation>> permutationTrue = new ArrayList<>();
        permuteList(listOperationTrue, 0, permutationTrue);
        System.out.println("\npermutationTrue");
        permutationTrue.stream().forEach(System.out::print);
        System.out.println();

        List<List<Operation>> permutationFalse = new ArrayList<>();
        permuteList(listOperationFalse, 0, permutationFalse);
        System.out.println("\npermutationFalse");
        permutationFalse.stream().forEach(System.out::print);

        System.out.println("\n\npermutationTrue -> permutationFalse");
        permutationTrue.stream().forEachOrdered(pTrue -> {
            permutationFalse.stream().forEachOrdered(pFalse -> {
                pTrue.stream().forEach(System.out::print);
                System.out.print(" -> ");
                pFalse.stream().forEach(System.out::print);
                System.out.println();
            });
        });
    }

    private static void permuteList(List<Operation> listOperation, int pos, List<List<Operation>> out) {
        if (pos == listOperation.size() - 1) {
            out.add(listOperation);
        } else {
            for (int i = pos; i < listOperation.size(); i++) {
                listOperation = swap(listOperation, pos, i);
                permuteList(listOperation, pos + 1, out);
                listOperation = swap(listOperation, pos, i);
            }
        }
    }

    public static List<Operation> swap(List<Operation> listOperation, int i, int j) {
        List<Operation> outSwap = new ArrayList<>(listOperation);
        outSwap.set(i, listOperation.get(j));
        outSwap.set(j, listOperation.get(i));
        return outSwap;
    }

}

输出:

    permutationTrue
    [Operation{value=1.3, inc=true}, Operation{value=2.7, inc=true}][Operation{value=2.7, inc=true}, Operation{value=1.3, inc=true}]

    permutationFalse
    [Operation{value=0.9, inc=false}, Operation{value=0.8, inc=false}][Operation{value=0.8, inc=false}, Operation{value=0.9, inc=false}]

    permutationTrue -> permutationFalse
    Operation{value=1.3, inc=true}Operation{value=2.7, inc=true} -> Operation{value=0.9, inc=false}Operation{value=0.8, inc=false}
    Operation{value=1.3, inc=true}Operation{value=2.7, inc=true} -> Operation{value=0.8, inc=false}Operation{value=0.9, inc=false}
    Operation{value=2.7, inc=true}Operation{value=1.3, inc=true} -> Operation{value=0.9, inc=false}Operation{value=0.8, inc=false}
    Operation{value=2.7, inc=true}Operation{value=1.3, inc=true} -> Operation{value=0.8, inc=false}Operation{value=0.9, inc=false}
    BUILD SUCCESSFUL (total time: 0 seconds)

【讨论】:

  • 置换算法改编自geeksforgeeks.org/…
  • 推荐阅读:When to use LinkedList over ArrayList in Java? 简而言之,你很少会找到一个用例,其中LinkedList 是可取的,并且广泛使用交换操作的代码,即get(int)set(int, T),绝对是不是这些情况之一。
  • @Holger 谢谢,我改变了使用的类。我会读你的帖子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-19
  • 1970-01-01
  • 2010-11-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多