2011-02-10 9 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

最も簡単な方法は、余分なレベルの間接指定を使用することです。たとえば、並べ替える3つの要素のインデックスのリスト(ここでは、リンクされたリストではない、リニアコレクションのみを意味する)を作成し、そのインダイレクションのレイヤーを比較/スワップするコードを作成します。ジェリー棺の提案に

+0

これは基本的に私が考えていたことです。あなたの言語がポインタをサポートしていれば、必要な要素へのポインタの配列を作成し、ポインタの内容をソートすることができます。 – Argote

+0

また、索引付けをしていてマッピングが簡単な場合は、サブリスト索引を基本配列索引に変換する簡単な索引機能を作成できます。 – payne

+0

機能的な種類のリストを使用する場合は、サブリストの要素の元のインデックスを保存してから、ソートされたサブリストを元のものにマージすることができます。 – comingstorm

0

おかげで、ここに興味がある人のためのJavaでのソリューションです:

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ループはソートされた値 を元の配列に戻します。

関連する問題