2016-05-02 40 views
1

私は二重の配列をソートしようとしたが、別の文字列配列で: それは私がこれを持って 意味:別の文字列配列で二重配列をソートする方法は?

Double[] values = {6.3, 5.5 , 7.0}; 
String [] names ={"samah","Dalal", "Mohammad"}; 

samahは、5.5を持ってDalalは、私がソートしたい場合は6.3Mohammad7.0

を持っています二重値の場合は、これを使用すると簡単です:

Arrays.sort(values); 

彼の場合の結果は{5.5,6.3,7.0}

しかし、私はどのようにこの並べ替えで名前の配列を保持しますか? 結果がでなければなりません:なぜあなたは2を使用している

答えて

3

両方の値を含む新しいタイプを追加し、Comparableを実装します。 Arrays.sort()をソートするとき

public class Person implements Comparable<Person> { 

    private String name; 
    private double score; 

    public Person(final String name, final double score) { 
    this.name = name; 
    this.score = score; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(final String name) { 
     this.name = name; 
    } 

    public double getScore() { 
     return score; 
    } 

    public void setScore(final double score) { 
     this.score = score; 
    } 

    @Override 
    public int compareTo(final Person another) { 
     return Double.compare(score, another.score); 
    } 
} 

Personの配列は、スコアで注文する必要があります。

+0

人を名前でソートするのはある時点で意味があるかもしれません。したがって、 '' 'Person''に' '' Comparable <...> '' 'を実装する代わりに、固定実装されています。並べ替えの際に '' Comparator'''を渡したいと思います: '' 'Arrays.sort(people、(x、y) - > Double.compare(x.getScore()、y.getScore())); '' ' –

+0

それは私の答えよりも理にかなっています。 – alex

+0

Jorn "人"はどういう意味ですか? – Samah

0

は私が間違っているなら、私を修正して、目的はそれはケースが続いている場合、正しく名とそれに対応する値を格納することです{"Dalal","samah","Mohammad"}

おかげで、

異なる配列ですか? マップ内の値と名前を読んでみませんか?

マップで読み込んだ場合、名前と値の順序を維持するという問題に直面する必要はありません。 これを行うと、並べ替えの必要性が減ります。

+0

「マップ」とはどういう意味ですか? – Samah

+0

ハッシュマップまたはツリーマップのようにマップします。これらはjavaのデータ構造です。 –

+0

私は 'TreeMap tm = new TreeMap();'を使い、forループでは 'tm.put(country、new Double(d));'を入れましたので、今は国と値の多くを持っています。これらの値を使って並べ替え、国を取得しますか? – Samah

0

TreeMapは、キーを文字列データとしてダブルデータと値として使用します。 TreeMapはキーによって自動的にソートされます。

+0

私は今これを試して、私はあなたに何が起こるかをお知らせします – Samah

0

Comparatorを使用しても解決できます。マークに基づいてソートする場合は、PersonMarksComparatorを使用します。名前に基づいてソートする場合は、PersonNameComparatorを使用してください。複数の方法で並べ替えたい場合は非常に便利です。

class PersonMarksComparator implements Comparator<Person> { 

    @Override 
    public int compare(Person person1, Person person2) { 
     return Double.compare(person1.getMarks(), person2.getMarks()); 
    } 
} 

class PersonNameComparator implements Comparator<Person> { 

    @Override 
    public int compare(Person person1, Person person2) { 
     return person1.getName().compareTo(person2.getName()); 
    } 
} 

public class Person { 

    private String name; 
    private double marks; 

    public Person(final String name, final double marks) { 
     this.name = name; 
     this.marks = marks; 
    } 

    //getters and setters 

    public static void main(String[] args) { 
     List<Person> persons = new ArrayList<Person>(); 
     Person person1 = new Person("samah", 5.5); 
     Person person2 = new Person("Dalal", 6.3); 
     Person person3 = new Person("Mohammad", 7.0); 
     persons.add(person1); 
     persons.add(person2); 
     persons.add(person3); 
     Collections.sort(persons, new PersonMarksComparator()); 
     Collections.sort(persons, new PersonNameComparator()); 
    } 
} 
0

これを試してください。(Java8用)

Double[] values = {6.3, 5.5 , 7.0}; 
String [] names ={"samah","Dalal", "Mohammad"}; 
String[] sortedNames = IntStream.range(0, names.length) 
    .mapToObj(i -> i) 
    .sorted(Comparator.comparing(i -> values[i])) 
    .map(i -> names[i]) 
    .toArray(String[]::new); 
System.out.println(Arrays.toString(sortedNames)); 

結果:

[Dalal, samah, Mohammad] 

プロセス:

  1. インデックスのIntStreamを作成 - > [0、1、2]
  2. Integerオブジェクトに各インデックスに変換 - > [0,1,2]
    (IntStremにはsorted(Comparator)メソッドがないため)
  3. 値によって各インデックスが[インデックス]並び - > [1、0,2]
  4. 名前に各インデックス地図[インデックス] - > [ "Dalal"、 "samah"、 "Mohamand"]
  5. 保存配列としての結果 - > ["Dalal"、 "samah"、 "Mohamand"]
+0

私はIntStreamと "定義されていない"エラーがあります - 私は,,,それはあなたと一緒に働くのですか? – Samah

+0

申し訳ありませんが、Java8が必要です。 – saka1029

関連する問題