@Override
	public void process(List<Seed> seeds) {
		this.seeds = seeds;
		OrderedSeeds orderedSeeds = new OrderedSeeds();
		List<Seed> neighbors = null;
		for (Seed obj : seeds) {
			if (obj.isProcessed()) {
				continue;
			}
			neighbors = this.rangeQuery(obj);
			obj.setProcessed(true);
			Map<String, Double> objDistances = obj.getDistances();
			System.out.println(obj.toPrintableString());
			// Set the core distance of the current object.
			// Also stop computing, if the seed is no core point.
			if (obj.getCoreDistance() != Seed.INFINITY) {
				for (Seed neighbor : neighbors) {
					double tempReachabilityDistance = Math.max(
							obj.getCoreDistance(),
							objDistances.get(neighbor.getName()).doubleValue());
					neighbor.setReachabilityDistance(Math.min(
							neighbor.getReachabilityDistance(),
							tempReachabilityDistance));
					orderedSeeds.insertOrUpdate(neighbor);
				}
				while (!orderedSeeds.isEmpty()) {
					Seed poppedSeed = orderedSeeds.pop();
					neighbors = rangeQuery(poppedSeed);
					// Set the processed state of the popped element.
					poppedSeed.setProcessed(true);
					Map<String, Double> poppedSeedDistances = poppedSeed
							.getDistances();
					System.out.println(poppedSeed.toPrintableString());
					// Set the core distance of the current ordered seed
					// element.
					// Also stop computing, if the seed is no core point.
					if (poppedSeed.getCoreDistance() != Seed.INFINITY) {
						for (Seed neighbor : neighbors) {
							double tempReachabilityDistance = Math.max(
								poppedSeed.getCoreDistance(),
								poppedSeedDistances
									.get(neighbor.getName())
									.doubleValue()
							);
							neighbor.setReachabilityDistance(Math.min(
									neighbor.getReachabilityDistance(),
									tempReachabilityDistance));
							orderedSeeds.insertOrUpdate(neighbor);
						}
					}
				}
			}
		}
	}