2016-12-21 7 views
2

私はC++プログラマーの学生で、Javaを学び始めています.2つの文字列値(名前とID)を持つ候補クラスを読みたいと思います。これらの候補をコンテナに保管してください。Javaの読み込み中の並べ替え

この状況で使用するのに最適なコンテナは何か、名前で並べ替えるときにこれらの値を保存するにはどうすればよいですか。

私はSTLライブラリに慣れていたので、ベクタやリストのようなものを考えていました。

ありがとうございます!

+3

重複を許可する必要がない限り、おそらく 'TreeSet'を使用します。 –

+1

ユースケースを明確にしてください。顕著な特徴を分類していますか?デフォルトでソートされていないSTL vectorまたはlistについて述べました。 – shiri

+0

この質問は数回前にはほとんど間違いなく答えられていますので、カスタムタイプの並べ替えに関する質問はStack Overflowを参照してください。 'TreeSet 'のコンストラクタに与えられたカスタム 'Comparator'を使ってジョブを行います。ここでは、これに関するサンプルコードを提供しているSOの答えがあります。 – Bobulous

答えて

-5

SortedMapSortedListをご覧ください。

+2

コアJavaには存在しない "SortedList"は、 'List'という概念に反します。 http://stackoverflow.com/questions/8725387/why-is-there-no-sortedlist-in-java – Zircon

+0

私の間違いを参照してください。 TreeSetを考えていて、脳のうずきをしていました。 – arcy

+0

質問は「この状況で使用するのに最適なコンテナは何でしょうか、名前で並べ替えるときにこれらの値を保存するにはどうすればよいですか」というツリーセットです。間違い、および私が言ったSortedMapはその質問に対する答えです。これはプログラミングに精通しているが新しい言語に慣れ親しんだ人で、必要なのは正しいクラスへのポインタです。 – arcy

2

あなたが探しているユースケースはなんですか?最適なコンテナは、挿入、削除、順序どおりの読み込みなどの使用状況に依存します。

C++ STLクラスに相当するJavaに興味があれば、std :: vectorに相当するJavaはArrayList(Equivalent of std::vector in Java?を参照)。両方とも動的配列です。

私が間違っていない場合、std :: listに相当するJavaはLinkedListです。

この回答は、トピックの素敵な概観います:あなたはソート順序を維持しながら、あなたは可能性が高いとしてTreeSetのとの最高のだろう挿入しを削除されたリストを探しているなら Linked List vs Vector

を上記のコメントに記載されています。

+0

これは 'Candidate'オブジェクトをそれらに含まれる名前の値でソートしません。 – Bobulous

+0

修正、編集済み。しかし、問題は未分類のSTLクラスについて議論しているのであいまいです。 – shiri

1

あなたはおそらく最高そして、あなたは、単に等を介して、それをインスタンス化することができ、このコンストラクタhttps://docs.oracle.com/javase/7/docs/api/java/util/PriorityQueue.html#PriorityQueue(int,%20java.util.Comparator)

PriorityQueueを使用して提供しています:

new PriorityQueue<Candidate>(10, new Comparator<Candidate>() { 
      @Override 
      public int compare(final Candidate o1, final Candidate o2) { 
       return Candidate.getName().compareTo(o2.getName()); 
      } 
     }); 

10はちょうどここに例の容量になり、あなたは何でも選ぶことができますあなたのユースケースに合っています。

Candidateオブジェクトは、Comparatorが指定されているため、自動的に各インサートの名前に従って並べ替えられます。

+1

好奇心から、なぜあなたは 'TreeSet'に対して' PriorityQueue'を勧めますか? – Bobulous

+0

@Bobulous 'TreeSet'は、' Set'というより一般的でない回答でした。 「候補者」と言えば、重複がないと考えることができます。なぜなら、問題の説明には含まれていないときに一意性制約を導入する理由は何でしょうか?:) –

+0

@ArminBraunあなたの答えをありがとう、私は最終的にTreeSetを使用することにしましたが、基本的に私はそれに慣れています。ありがとう! – magalenyo

0

あなたはソート順に維持された容器に挿入するTreeSetを使用することができます。ただし、これはリストではなくセットなので、索引でアクセスすることはできません。

0

簡単なアプローチ:

//あなたの候補クラスを宣言として:

class Candidate 
    { 
     int id; 
     String name; 

     Candidate(int id,String name) 
     { 
     this.id=id; 
      this.name=name; 
     } 

     public int getId() 
     { 
      return this.id; 
     } 

     public String getName() 
     { 
      return this.Name; 
     } 
    } 

class Main 
{ 
     public static void main(String args[]) 
     { 
      ArrayList<Candidate> al=new ArrayList<Candidate>(); 
      al.add(new Candidate(1,"ABC")); 
      al.add(new Candidate(2,"XYZ")); 
      al.add(new Candidate(3,"PQR")); 

      Collections.sort(al,new SortByName()); 

      System.out.println(al); 

     } 
    } 

//名前によってあなたが

class SortByName implements Comparator<Candidate> 
    { 
     public int compare(Candidate c1,Candidate c2) 
     { 
      return c1.getName().compareTo(c2.getName()); 
     } 
    } 

を掲載している//としてソートするコンパレータを宣言Javaの初心者で、あなたの要件に応じて、クラスのオブジェクトを格納するコンテナを持ち、そのフィールド名でソートしたいと思っています。したがって、私はCollectionsクラスのArrayListを使い、初心者のためにとても使いやすく、arraylistクラス、Comparator、Collectionsメソッドなどいくつかの基本概念を理解することができます。

+0

なぜ私はdownvoteをここで得たのですか? –

+0

OPは、コレクション名の変種として学生名によるソート済みコレクションを保持したいと考えています。彼は演奏操作の前に毎回それをそのコレクションのどの操作でもソートしたくない。 しかし、彼は同じようなC++ 11のベクトル/リストを使用したいと言って以来、混乱を招く可能性があります。ここでは紳士であるため+1です。あなたはそのダウンホントに値するものではありません。 – Aviv

0

すべての回答をいただきありがとうございます。私に許諾した提案を調査した結果、TreeSetを使用することにしました。再度、感謝します!

関連する問題