📄 defaultsort.java
字号:
/* created at 2006-1-3 */
package com.clustering.core.support;
import java.util.Comparator;
import java.util.Iterator;
/**
* 这个类的加入减小了类的粒度,增加了在创建GeneratingTree时所使用的比较的灵活性, 但这个类是被要求提出的,原因就是要看排序.
* <P>
* 这个排序是简单的选择排序,但选择排序不会发生,直到通过迭代器访问时,并且迭代器提取一个元素,该方法排出一个记录,该排序稳定
* 由于DefaultSort不支持记录排序信息,所以在SimpleGeneratingTree中没有被使用,如果以后想更新SimpleGeneratingTree的
* 排序算法,那么就考虑用这个
*
* @author Avon
* @version 0.9
* @since 0.9
*/
public class DefaultSort implements Sort {
private Comparator comparator;
private Object[] sortingSequence;
private boolean isDecending;
/*
* CharArrayWriter cWriter;
*
* PrintWriter out;
*/
public DefaultSort() {
comparator = null;
sortingSequence = null;
isDecending = true;
/*
* cWriter = new CharArrayWriter(); out = new PrintWriter(cWriter);
* out.println("Sorting sequence. Here the program only log the records
* which has been sorted. " + "But not the whole sequence's sorting
* result.");
*/
}
/**
* 是用比较起Comparator按照isDecending对sortingSequence中的元素排序
*
* @param sortingSequence
* @param isDecending
* @param comparator
*/
public DefaultSort(Object[] sortingSequence, boolean isDecending, Comparator comparator) {
this();
this.sortingSequence = sortingSequence;
this.isDecending = isDecending;
this.comparator = comparator;
}
public void setComparator(Comparator comparator) {
this.comparator = comparator;
}
public Comparator getComparator() {
return comparator;
}
public void setSortingSequence(Object[] sequence) {
sortingSequence = sequence;
}
public Object[] getSortingSequence() {
return sortingSequence;
}
public boolean isDescending() {
return isDecending;
}
public void setDescending(boolean isDescending) {
this.isDecending = isDescending;
}
public Iterator iterator() {
return new IteratorImpl();
}
/*
* @Override public String toString() { out.close(); cWriter.close(); return
* cWriter.toString(); }
*/
private class IteratorImpl implements Iterator {
int count;
boolean[] isSorted;
IteratorImpl() {
count = 0;
if (null == comparator)
for (int i = 0; i < sortingSequence.length; i++) {
if (!Comparable.class.isAssignableFrom(sortingSequence[i].getClass()))
throw new UnsupportedOperationException("U did not set Comparator and the object" + i
+ " in sorting sequence does not implements Comparable. "
+ "Sorting can not be proceeded until u specify a compartor or "
+ "all elements in sorting sequence implements Comparable.");
}
isSorted = new boolean[sortingSequence.length];
// 有必要这么做
for (int i = 0; i < isSorted.length; i++) {
isSorted[i] = false;
}
}
public boolean hasNext() {
return count < sortingSequence.length;
}
@SuppressWarnings("unchecked")
public Object next() {
count++;
int tmp = 0;
// 找第一个未排过续的元素做tmp
for (int i = 0; i < isSorted.length; i++) {
if (!isSorted[i])
tmp = i;
}
if (null != comparator) {
for (int i = 0; i < sortingSequence.length; i++) {
if (isSorted[i])
continue;
// 降序找大的
if (isDecending) {
if (comparator.compare(sortingSequence[i], sortingSequence[tmp]) > 0)
tmp = i;
}
// 升序找小的
else {
if (comparator.compare(sortingSequence[i], sortingSequence[tmp]) < 0)
tmp = i;
}
}
} else {
for (int i = 0; i < sortingSequence.length; i++) {
if (isSorted[i])
continue;
// 降序找大的
if (isDecending) {
if (((Comparable) sortingSequence[i]).compareTo(sortingSequence[tmp]) > 0)
tmp = i;
}
// 升序找小的
else {
if (((Comparable) sortingSequence[i]).compareTo(sortingSequence[tmp]) < 0)
tmp = i;
}
}
}
/*
* // ! 没有办法添加坐标 因此不能在此处记录排序信息 out.printf("pow=%.3f",
* sortingSequence[tmp]); if (count % 5 == 0) out.println();
*/
return sortingSequence[tmp];
}
public void remove() {
throw new UnsupportedOperationException("Sorting process of dataming does not allow u to modify data.");
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -