AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Array sortieren mit Permutationen..

Ein Thema von Ducksoul · begonnen am 1. Mär 2010 · letzter Beitrag vom 17. Mär 2010
 
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
 

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:02 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz