package org.bundlemaker.core.analysis.algorithms.sorter; import java.util.ArrayList; import java.util.List; import org.bundlemaker.core.analysis.IBundleMakerArtifact; import org.bundlemaker.core.analysis.algorithms.AdjacencyMatrix; import org.bundlemaker.core.analysis.algorithms.FastFAS; public class FastFasSorter implements IArtifactSorter { /** * {@inheritDoc} */ @Override public List<IBundleMakerArtifact> sort(List<IBundleMakerArtifact> artifacts) { // we have to compute the adjacency matrix first int[][] adjacencyMatrix = AdjacencyMatrix.computeAdjacencyMatrix(null, artifacts); // the ordered sequence (highest first!) FastFAS fastFAS = new FastFAS(adjacencyMatrix); int[] ordered = fastFAS.getOrderedSequence(); // Bubbles for (int outerIndex = 1; outerIndex < ordered.length; outerIndex++) { for (int index = outerIndex; index >= 1; index--) { // if (adjacencyMatrix[ordered[index]][ordered[index - 1]] > adjacencyMatrix[ordered[index - 1]][ordered[index]]) { // swap... int temp = ordered[index]; ordered[index] = ordered[index - 1]; ordered[index - 1] = temp; } else { // stop bubbling... break; } } } // reverse it ordered = FastFAS.reverse(ordered); // create the result list List<IBundleMakerArtifact> result = new ArrayList<IBundleMakerArtifact>(artifacts.size()); for (int index : ordered) { result.add(artifacts.get(index)); } // artifacts.clear(); artifacts.addAll(result); return artifacts; } }