Einzelnen Beitrag anzeigen

Ducksoul

Registriert seit: 19. Apr 2006
Ort: Ilmenau
87 Beiträge
 
RAD-Studio 2009 Pro
 
#8

Re: Array sortieren mit Permutationen..

  Alt 8. Mär 2010, 17:32
Ja, in Java sieht das ganze so aus:

Delphi-Quellcode:
// 5. Generiere Permutationen einer jeden neuen ArrayList
      List<List<List<TJob>>> prio_list = new ArrayList<List<List<TJob>>>();
      for (int i = 0; i < equalPrio_list.size(); i++) {
         int[] indices;
         List<TJob> elements = equalPrio_list.get(i);
         List<List<TJob>> li = new ArrayList<List<TJob>>();
         PermutationGenerator x = new PermutationGenerator(elements.size());
         while (x.hasMore()) {
            indices = x.getNext();
            List<TJob> tj_list = new ArrayList<TJob>(10);
            for (int j = 0; j < indices.length; j++)
               tj_list.add(elements.get(indices[j]));
            li.add(tj_list);
         }

         prio_list.add(li);
      }
Und die Klasse zum Generieren von Permutationen:

Delphi-Quellcode:
//--------------------------------------
// Systematically generate permutations.
// [url]http://www.merriampark.com/perm.htm[/url]
//--------------------------------------

import java.math.BigInteger;

public class PermutationGenerator {

  private int[] a;
  private BigInteger numLeft;
  private BigInteger total;

  //-----------------------------------------------------------
  // Constructor. WARNING: Don't make n too large.
  // Recall that the number of permutations is n!
  // which can be very large, even when n is as small as 20 --
  // 20! = 2,432,902,008,176,640,000 and
  // 21! is too big to fit into a Java long, which is
  // why we use BigInteger instead.
  //----------------------------------------------------------

  public PermutationGenerator (int n) {
    if (n < 1) {
      throw new IllegalArgumentException ("Min 1");
    }

    a = new int[n];
    total = getFactorial (n);
    reset ();
  }

  //------
  // Reset
  //------

  public void reset () {
    for (int i = 0; i < a.length; i++) {
      a[i] = i;
    }

    numLeft = new BigInteger (total.toString ());
  }

  //------------------------------------------------
  // Return number of permutations not yet generated
  //------------------------------------------------

  public BigInteger getNumLeft () {
    return numLeft;
  }


  //------------------------------------
  // Return total number of permutations
  //------------------------------------

  public BigInteger getTotal () {
    return total;
  }


  //-----------------------------
  // Are there more permutations?
  //-----------------------------

  public boolean hasMore () {
    return numLeft.compareTo (BigInteger.ZERO) == 1;
  }


  //------------------
  // Compute factorial
  //------------------

  private static BigInteger getFactorial (int n) {
    BigInteger fact = BigInteger.ONE;
    for (int i = n; i > 1; i--) {
      fact = fact.multiply (new BigInteger (Integer.toString (i)));
    }

    return fact;
  }

  //--------------------------------------------------------
  // Generate next permutation (algorithm from Rosen p. 284)
  //--------------------------------------------------------

  public int[] getNext () {

    if (numLeft.equals (total)) {
      numLeft = numLeft.subtract (BigInteger.ONE);
      return a;
    }


    int temp;

    // Find largest index j with a[j] < a[j+1]

    int j = a.length - 2;
    while (a[j] > a[j+1]) {
      j--;
    }


    // Find index k such that a[k] is smallest integer
    // greater than a[j] to the right of a[j]

    int k = a.length - 1;
    while (a[j] > a[k]) {
      k--;
    }


    // Interchange a[j] and a[k]

    temp = a[k];
    a[k] = a[j];
    a[j] = temp;

    // Put tail end of permutation after jth position in increasing order

    int r = a.length - 1;
    int s = j + 1;

    while (r > s) {
      temp = a[s];
      a[s] = a[r];
      a[r] = temp;
      r--;
      s++;
    }


    numLeft = numLeft.subtract (BigInteger.ONE);
    return a;

  }

}

Allerdings weiß ich nich wie ich das auf Delphi portieren soll

Ich bin nu auch nich so der dolle Programmierer. Und wenns um OO geht, sieht das ganze noch n bissl düsterer aus.


Edit:
Um auf deine Frage zu antworten:

Ich habe ein Array mit TJobs (was Records, welche verschiedene Daten enthalten, sind). Und ich hätte dann wenn ich ein Array

arr ( job1, job2, job3) habe gerne alle 6 möglichen Kombinationen.

Gruß


Edit2: Um nicht die Lorbeeren einzuheimsen: Der Javacode ist nicht von mir. Lediglich der Delphicode den ich bis jetzt habe sind meine Ergüsse *g*
Franz
  Mit Zitat antworten Zitat