2011-02-10 5 views
1

다음 목록이 있다고 가정 해 봅시다 : [2, 1, 4, 6, 3, 7]. 또한 어떤 목록을 정렬하는 몇 가지 방법이 있습니다. 그러나 인덱스 1, 2, & 4의 요소, 즉 하위 목록 [1, 4, 3]에서만 정렬을 수행하려고합니다. 이 하위 목록을 정렬하면 [1, 3, 4]가 생성됩니다. 인덱스 1, 2 및 4 (예 : [2, 1, 3, 6, 4, 7]) 만 정렬 할 수있는 방법은 무엇입니까?분리 된 하위 목록을 정렬하는 방법은 무엇입니까?

+0

나는 [Rosetta Code] (http://rosettacode.org/wiki/Sort_disjoint_sublist)에서 버전을 만들었습니다. 지금까지의 답변은 J와 Python에 있습니다. – Paddy3118

답변

2

가장 쉬운 방법은 추가 수준의 간접 지정을 사용하는 것입니다. 예를 들어, 정렬하려는 세 요소의 색인에 대한 목록 (여기서는 링크 된 목록 일 필요는없는 선형 모음을 의미 함)을 작성하고 해당 간접 계층을 비교/교환하기위한 코드를 작성하십시오. 제리 관에 의해 제안에

+0

이것은 기본적으로 내가 생각한 것입니다. 언어가 포인터를 지원하면 원하는 요소에 대한 포인터의 배열을 만들고 포인터의 내용을 정렬 할 수 있습니다. – Argote

+0

또는 색인을 생성하고 매핑이 단순하면 하위 목록 인덱스를 기본 배열 인덱스로 변환하는 간단한 인덱스 함수를 만들 수 있습니다. – payne

+0

기능별 목록을 사용하는 경우 하위 목록 요소의 원래 색인을 저장 한 다음 정렬 된 하위 목록을 원본으로 다시 병합 할 수 있습니다. – comingstorm

0

감사합니다, 여기에 관심이있는 사람들을위한 자바 솔루션이다 :

import java.util.List; 
import java.util.AbstractList; 
import java.util.Arrays; 

public class ExtendedSubList<E> extends AbstractList<E> 
{ 
    protected final List<E> parent; 
    protected final int[] indices; 

    public static <E> List<E> subList(final List<E> parent, int ... indices) 
    { 
     if (parent == null) 
      throw new IllegalArgumentException("parent == null"); 
     if (indices == null) 
      throw new IllegalArgumentException("indices == null"); 
     for (int i = 0; i < indices.length; i++) 
      if (!(0 <= indices[i] && indices[i] < parent.size())) 
       throw new IllegalArgumentException(String.format("index %d (at position %d) is not in bounds", indices[i], i)); 
     Arrays.sort(indices); 
     return new ExtendedSubList(parent, indices); 
    } 

    protected ExtendedSubList(List<E> parent, int[] indices) 
    { 
     this.parent = parent; 
     this.indices = indices; 
    } 

    public E get(int index) 
    { 
     return parent.get(indices[index]); 
    } 
    public int size() 
    { 
     return indices.length; 
    } 

    public E set(int index, E element) 
    { 
     return parent.set(indices[index], element); 
    } 
} 

사용 예 :

List<Integer> list = Arrays.asList(2, 1, 4, 6, 3, 7); 
Collections.sort(ExtendedSubList.subList(list), 1, 2, 4); 

결과 목록을 생성 할 것이다 : [2, 1, 3, 6, 4, 7].

+0

다른 답변 대신 질문을 편집하여 게시 할 수 있습니다. 오, 그 대답을 받아 들여라. – Argote

0

다음 Python 코드가 작업을 수행합니다. 간접 검색을 통해 정렬하는 것이 아니라 값을 추출하고 정렬 한 다음 다시 삽입하는 방식과 달리 Jerry Coffins는 대답을 받아 들일 수 있습니다.

data = [7, 6, 5, 4, 3, 2, 1, 0] 
indices = sorted([1,2,4]) 
values = [data[i] for i in indices] # [6, 5, 3] 
values.sort()      # [3, 5, 6] 
for index, value in zip(indices, values): 
    data[index] = value 
print (data)       # [7, 3, 5, 4, 6, 2, 1, 0] 
  1. 원래 인덱스는 이 작동하는 것들에 대한 분류되어야한다.
  2. 해당 값은 입니다.

  3. 값이 정렬됩니다.

  4. for 루프는 정렬 된 값 을 원래 배열로 되돌립니다.

관련 문제