문제

나는 현재 재생 중인으로 구현하는 다양한 정렬 알고리즘에서 Java,대부분에 대한 재미있지만,나는 고군분투하는 방법으로 그것을'권리'.즉,내가 원하는 사용자를 호출할 수 있도록 정렬 알고리즘의 선택은 어떤 것도 비교- ints longs Strings booleans(실제로,이들은 비교에서 Java?), 자신의 클래스whatever.이 질문은 이렇게 하는 방법.

나는 생각하고 있었을 사용하여 클래스를 대표하는 정렬 알고리즘,따라서 저장할 것을 정렬되는 내부 사용하여 일반 목록 또는 어떤(List<E>).이것은 또한 나를 사용하여 여러 생성자를 사용할 수 있으므로 사용자에게 전달에서는 다양한 형태의 데이터를트,배열,어떤 것이다.이것은 올바른 방법으로 할 수 있나요?현재 문제는 나를 위한 사용자가 있는 클래스를 만들고 싶을 때종 무언가를,오히려 그것을 할 수 있었을 것이라고 많 System.out.println 다.

// Example:

int[] myInts = {5,4,3,2,1};

// This is what I do *not* want.
InsertionSort mySort = new InsertionSort();
int[] sortedInts = mySort.sort(myInts);

// This is more like what I want.
int[] sortedInts = Sorting.insertionSort(myInts);

내가 사과와 함께 무엇이처럼 보일 수 있는 기본적인 질문,하지만 난 그냥 학습 내 방식으로 프로그래밍 언어입니다.는 주사위를 굴려,친구들과 부 2nd 년 컴퓨팅 작업하는 학생에서 소프트웨어 회사에 대한 자신의 여름 일,하지만 당신은 놀라게 될 것에 어떻게 작 프로그래밍 지식이 필요한다.그것은 일반적으로 더 많은 디자인 지식입니다.

편집:

명확성을 위해,나는 세 가지 주요 질문은:

  • 그것은 더 나은 사용자 만들기 등을 정렬하거나,정적 방법 클래스에서는 사용자가 수입?
  • 그것은 모두를 다루는 기본 데이터 유형 및 일반적인 개체를 쉽게?기 때문하고 싶을 처리할 수 있는 모든 일반적인 개체를 구현하는 대등(이나 마찬가지로),이런 문제를 일으키는 기본 형식으로(그들이 구현하지 않도)).
  • 무엇을 처리하는 가장 좋은 방법은 일반적인 입력이-무엇을 확인해야 합니까 전에 내가 하려고 그들을 정렬(을 구현하는 대등한,예를 들어)?
도움이 되었습니까?

해결책

당신이 걸릴 수 있으로 예 방법 컬렉션 제공 binarySearch 작업...고 실제로,

int[] sortedInts = Sorting.insertionSort(myInts);

더 java 방법으로,심지어 내가하고자하는 경우 personnally 아보세요

public class Sorting {
     public static <DataType extends Comparable> Iterable<DataType> insertionSort(Iterable<DataType> data);
}
  • <DataType> 보 출력 데이터는 동일한 유형의 보다 입력
  • Iterable<DataType> 데이터 입력 데이터는 반복 가능한 보장하기 위해,최고의 호환성을 자랑합니다.분명한 목록을 사용하는 것에 의해 훨씬 간단한을 허용하기 때문에,내 항목의 순서 변경.미국"r 를 사용하여 반복 가능한지 확인합 구현자의 이 방법을 다시 만들어야 목록에서 수정하려면,그것을 보장하는 입력한 목록을 변경하지 않고 목록을 출력은 또 다른 하나입니다.

이후 나는 그냥 당신이 편집,질문에 나에게 대답하여 점점(고려 선택 응답한 후에는,그것은 쉽게 새로운 질문을 추가하는 것보다는 기존 편집이 끝없이지 않는 한 당신이 당신의 질문 커뮤니티 wiki,어떻게 이 답변)

그것은 더 나은 사용자 만들기 등을 정렬하거나,정적 방법 클래스에서는 사용자가 수입?

내 마음,사용하는 정적 방법을 이 경우에는 것이 바람직으로,당신은 여기에는 개체를 조작하는 만들지 않는,매우"기본"패션이다.

그것은 모두를 다루는 기본 데이터 유형 및 일반적인 개체를 쉽게?기 때문하고 싶을 처리할 수 있는 모든 일반적인 개체를 구현하는 Comparable (이나 마찬가지로),이런 문제를 일으키는 기본 형식으로(그들이 구현하지 않도)).

에 대한 이야기를 들어본 적이 있습 autoboxing ?그것의 기능 자바의 5 개 만드는 기본 형식"해당하"의 개체입니다.는 말을 int 자동으로 변환로 정수는 당신이 알고있을 구현하고,비교할 수 있습니다.

무엇을 처리하는 가장 좋은 방법은 일반적인 입력이-무엇을 확인해야 합니까 전에 내가 하려고 그들을 정렬(을 구현하는 대등한,예를 들어)?

알 수 있으로 인해,내 방법을 선언은(가),를 확인하는 입력한 데이터 구현과 비교에 의해 수행되지 않지만 당신은하지만,Jav 컴파일러를 허용,당신의 IDE 을 보여 당신은 실수를 합니다.

다른 팁

나는 당신이 대답한 자신의 질문?하려면 노출 정적 방법을 만드는 대신 사용자 만들고 개체고 전화 인스턴스 방법,그냥 하십니다. Sorting.insertionSort() 나에게 잘 보이는.

내부적으로 파견할 수 있습니다면 당신이 무엇을 좋아합니다.내부에 원하는 경우 이를 구현하는 클래스고 다형성과 등등으로,앞으로 이동합니다.그것은 것처럼 비트 잔지만.나는 확실하지 않는 상속 및 다형성에 많은 도움이됩니다 여기에.

일반적인 방법으로 구현하는 정렬 알고리즘을 것을 구현하는 정적 방법,예를 들어,을 살펴의 소스 코드 배열입니다.정렬().당신은 오버로드 할 수 있습니다이 방법으로 가지 다른 구현한 다른 매개변수 유형(예를들면객체를 구현하는 대등한 대제공하는 당신의 자신의 비교 대원시적인 배열 등)

여기에 하나의 앞에서 썼다:

public static <T> void swap(T[] a, int x, int y) {
    T t=a[x];
    a[x]=a[y];
    a[y]=t;
}

public static <T extends Comparable<? super T>> void mergeInOrder(T[] src, T[] dst, int p1, int p2, int p3, int p4) {
    if (src[p2].compareTo(src[p3])<=0) return; // already sorted!

    // cut away ends
    while (src[p1].compareTo(src[p3])<=0) p1++;
    while (src[p2].compareTo(src[p4])<=0) p4--;

    int i1=p1;
    int i3=p3;
    int di=p1;
    while(di<p4) {
        if (src[i1].compareTo(src[i3])<=0) {
            dst[di++]=src[i1++];
        } else {
            dst[di++]=src[i3++];
            if (i3>p4) {
                System.arraycopy(src,i1,dst,di,p2-i1+1);
                break;
            }
        }
    }

    System.arraycopy(dst, p1, src, p1, (p4-p1)+1);
}

public static <T extends Comparable<? super T>> void mergeSort(T[] src, T[] dst, int start, int end) {
    if (start+1>=end) {
        if (start>=end) return;
        if (src[start].compareTo(src[end])>0) {
            swap(src,start,end);
        }
        return;
    }

    int middle=(start+end)/2;
    mergeSort(src,dst,start, middle);
    mergeSort(src,dst,middle+1, end);
    mergeInOrder(src,dst,start,middle,middle+1,end);
}

private static ThreadLocal<Comparable<?>[]> mergeSortTemp=new ThreadLocal<Comparable<?>[]>();

@SuppressWarnings("unchecked")
public static <T extends Comparable<? super T>> void mergeSort(T[] src) {
    int length=src.length;
    Comparable<?>[] temp=mergeSortTemp.get();
    if ((temp==null)||(temp.length<length)) {
        temp=new Comparable[length*3/2];
        mergeSortTemp.set(temp);
    }
    mergeSort(src,(T[])temp,0,length-1);
}

그러나 내가 생각할 수 있는 두 가지 좋은 이유를 구현하는 정렬 알고리즘으로 클래스는 당신이 당신의 자신의 인스턴스:

  • 그것은 당신이 당신 다형적으로 통과 주변의 인스턴스의 정렬 알고리즘이 유용할 수 있는 경우 예:당신의 컬렉션을 만들기 정렬 알고리즘 실행하고 싶어 많은 벤치마크들에 대한 예입니다.
  • 할 수 있는 개인 상태에서 분류한 인스턴스 이용에 대한 일부 정렬 알고리즘,예를 들어,일부 사전에 할당 배열에 대한 임시 저장,그리고 그것에 넣어 클래스의 인스턴스하려는 경우에 할 수있을 동시에 사용하여 다른 종류의 인스턴스에서 여러 스레드-정적 방법을 구현해야의 일부 양식을 동기화(예:보의 사용 ThreadLocal 위 코드에서).

나는 확실하지 않으면 이것은 당신이 무엇을 고민...하지만 그것은 다음을 불가능을 구현하는 알고리즘 작품 모두 참고 형식과(부)기본 형식.그 이유는 Java 유형 시스템에 있지 않는 개념적인 보편적인 유형은 기본 유형 Object 으로 특수형이 있습니다.

정상에 대한 해결 방법 이것은 포장하는 기본 형식을 사용하여 해당 wrapper classes;예: Integerint, Booleanbool 그래서.이것을 구현할 수 있습니다(예)정렬 알고리즘에 대한 어떠한 Collection<T><T>[].

이 방법은 성능/메모리 사용량 문제에 적용될 때는 큰 배열(말)의 정수입니다.중 하나를 착용하의 성능,또는 당신이 알고리즘을 구현 및 지원 클래스 별로 각각의 기본 유형입니다.

(말 다음 불가능하기 때문에,그것이 가능한 추상적인 비교의 한 쌍의 배열 요소 및 교환의 쌍의 배열 요소 방법에서는 노출하지 않는 실제적인 요소를 입력 인터페이스;예:

public interface ArraySortAdapter {
  public abstract int compareElements(Object array, int pos1, int pos2);
  public abstract void swapElements(Object array, int pos1, int pos2);
}

제공하는 다른 구현한 다른 배열 형식예:

public class IntArraySortAdapter implements ArraySortAdapter {
  public int compareElements(Object array, int pos1, int pos2) {
      int[] intArray = (int[]) array;
      if (intArray[pos1] < intArray[pos2]) {
          return -1;
      } else if (intArray[pos1] > intArray[pos2]) {
          return +1;
      } else {
          return 0;
      }
  }

  ...
}

그러나,이것은 복잡하고 비효율적이고,적어도...)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top