6

string と int の 2 つの配列 (1 次元) をマージして並べ替えることはできますか? 例えば:

String name[] = {"Percy", "Daniel, "Layla"};
int marks[] = {90, 87, 91};

Arrays.sort (name);
for(int i = 0; i < name.length; i++)
    System.out.println( (i+1) + ". "+ name[i] + "\t\t" + marks[i]);

それらをソートしたい場合は、出力を次のようにしたかったのです。

// before sorting
1. Percy       90
2. Daniel      87
3. Layla       91

// after sorting
1. Daniel      90
2. Layla       87
3. Percy       91

// the actual output that i wanted
1. Daniel      87
2. Layla       91
3. Percy       90

何をするように提案しますか?これらの 2 つの配列をリンクして、名前に従って並べ替えるにはどうすればよいですか? または、それらをマージするにはどうすればよいですか? 私が理解できる簡単な方法はありますか?私はコンパレーター、マージなどの使用についてネット上のどこでも読んでいましたが、それについてははっきりしていません。

私はJavaが初めてです。初心者向けの方法はありますか?

4

9 に答える 9

2

初心者向けのJavaクラスをお願いしました。ネット上には、コンパレーター、ツリーセット、およびその他の Java に関するすべての例がたくさんあります。間違いなく、時間をかけて目にするものすべてを読む必要がありますが、それらの例の多くは非常に明確です。何かを学ぼうとしていて、それがうまくいかない場合は、それ以上の時間を費やさないでください。最終的にうまくいくのが15番目または20番目の説明であっても、もう一度Googleで検索してください. これは非常に一般的です。それを理解するまで、過去のものを読まないでください。

マークの代わりに名前を使用することを除いて、@regulusが示唆するように、Comparableを実装する文字列を格納するクラスを必ず用意してください:)将来の参照のために、または二次比較のためにそれを持ちたい場合は、マークもクラスに格納してください(名前を比較した後)。これにより、要素に自然な順序が与えられます。各オブジェクト インスタンスを作成すると、...

それらを Java の TreeSet のインスタンスに挿入します。使用例を次に示します。

import java.util.TreeSet;
import java.util.Iterator;

public class IterateThroughElementsOfTreeSetExample {

  public static void main(String[] args) {

    //create object of TreeSet
    TreeSet tSet = new TreeSet();

    //add elements to TreeSet object
    tSet.add(new Integer("1"));
    tSet.add(new Integer("2"));
    tSet.add(new Integer("3"));

    //get the Iterator
    Iterator itr = tSet.iterator();

    System.out.println("TreeSet contains : ");
    while(itr.hasNext())
      System.out.println(itr.next());
  }
}

キーを挿入するとソートされるため、非常に高速です。

于 2013-10-26T03:32:39.153 に答える
1

あなたの問題は、を使用して簡単に解決できMapます。AMapは、リンクされたデータのペアを格納するために使用できるクラスです。各ペアには「キー」と「値」があります。マップに格納すると、対応するキーがあれば、任意の値をすばやく検索できます。マップ内のすべてのキーを反復処理または一覧表示する方法もあります。

Map問題を解決するためにa を使用する方法を示す簡単なプログラムを次に示します。

import java.util.*;

public class Example
{
    public static void main(String[] args)
    {
        String[] name = new String[] {"Percy", "Daniel", "Layla"};
        int[] marks = new int[] {90, 87, 91};

        // First create a TreeMap to hold the data.  A TreeMap is a special
        // kind of Map which keeps the keys in sorted order for you.
        // In this TreeMap, the keys will be Strings and the values
        // will be Integers.
        TreeMap<String, Integer> map = new TreeMap<String, Integer>();

        // Next, link each name in the names array to the corresponding mark
        // by putting them in the TreeMap.  Each name becomes a key
        // in the map, and each mark is a value.
        for (int i = 0; i < name.length; i++)
        {
            map.put(name[i], marks[i]);
        }

        // Now we can iterate over the keys in the map, and for each key
        // retrieve the corresponding value.  The TreeMap guarantees
        // the keys will be in sorted order.
        for (String key : map.keySet())
        {
            System.out.println(key + "\t" + map.get(key));
        }
    }
}

出力は次のとおりです。

Daniel  87
Layla   91
Percy   90
于 2013-10-26T04:23:42.783 に答える
1

標準的な解決策はありません。これを試して

static void sort(String[] name, int[] marks) {
    for (int i = 0; i < name.length; i++) {
        for (int j = i; j > 0 && (name[j - 1]).compareTo(name[j]) > 0; j--) {
            swap(name, j, j - 1);
            swap(marks, j, j - 1);
        }
    }
}

private static void swap(String[] x, int a, int b) {
    String t = x[a];
    x[a] = x[b];
    x[b] = t;
}

private static void swap(int[] x, int a, int b) {
    int t = x[a];
    x[a] = x[b];
    x[b] = t;
}

これは、Arrays.sort の挿入ソート アルゴリズムの修正版です。

于 2013-10-26T04:10:47.670 に答える
0

これは、私が新人だったときに通常行っていたことです。

        String name[] = {"Percy","Daniel","Layla"};
        int marks[] = {90, 87, 91};
        String merged[] = new String[name.length];
        for (int i=0; i< name.length; i++) {
            merged[i] = name[i]+"=="+marks[i];
        }
        Arrays.sort(merged);
        for(int i = 0; i < merged.length; i++) {
            System.out.println( (i+1) + ". "+ merged[i].split("==")[0] + "\t\t" + merged[i].split("==")[1]);
        }
于 2013-10-26T04:31:11.793 に答える
0

それは2つの方法を使用して行うことができます

  1. 名前のみでソートする場合は、名前とマークをキーと値として TreeMap に追加すると、自動的にソートされます。
  2. 両方でソートする必要がある場合は、これらの変数を使用してクラスを作成し、同等のインターフェイスを実装します。
于 2013-10-26T03:37:05.810 に答える
0

String 配列と整数配列をマージしても意味がありません。パフォーマンスが優先事項でない限り、オブジェクト指向の方法でソリューションを実装する方がはるかに優れています。名前とマークを保持するクラスを作成します。そのため、名前とマークのペアごとにこのクラスのインスタンスが存在します。次に、このクラスをソート可能にする Comparable インターフェイスを実装します。

class Grade implements Comparable<Grade>{
    String name;
    int mark;

    public int compareTo(Grade o) {
        return name.compareTo(o.name);
    }
}
于 2013-10-26T03:30:09.420 に答える
0

新しい Comparable クラスを作成するNameScore

public class NameScore implements Comparable<NameScore> {

private final String name;
private final int marks;

public NameScore(String name, int marks) {
    this.name = name;
    this.marks = marks;
}

@Override
public int compareTo(NameScore other) {
    // compare by name
    return this.name.compareTo(other.name);

    // compare by (ascending) marks 
    //return this.marks - other.marks;
}

@Override
public String toString() {
    return "" + name + " (" + marks + ")";
}
}

NameScore を使用して質問を解決する方法は次のとおりです。

public static void main(String[] args) {
    String name[] = {"Percy", "Daniel", "Layla"};
    int marks[] = {90, 87, 91};

    List<NameScore> list = new LinkedList<NameScore>();
    for (int i = 0; i < marks.length; i++) {
        NameScore element = new NameScore(name[i], marks[i]);
        list.add(element);
    }

    System.out.println("BEFORE : "+list);

    Collections.sort(list);

    System.out.println(" AFTER : "+list);
}
于 2013-10-26T03:44:55.157 に答える