1

float 配列と String 配列があります。各 float 値は特定の String と一致します。次を使用して、独自の文字列を保持する float 配列をソートしたいと思います。

public static <T> void sort(T[] a,Comparator<? super T> c)

コードは次のとおりです。

public class ResultVoiceObject
{

     private  String frase;
     private float ranking;
     public ResultVoiceObject(String f, float r) 
       {
        this.frase=f;
        this.ranking= r;
       }  
     }
     public class VoiceRecognitionDemo extends Activity
     {

       // Populate the wordsList with the String values the recognition engine thought it heard
        ArrayList<String> matches = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);          
        //il Ranking
        float[] score= data.getFloatArrayExtra(RecognizerIntent.EXTRA_CONFIDENCE_SCORES);

        ResultVoiceObject[] risultati= new ResultVoiceObject[score.length];
        for (i=0; i<risultati.length;i++)
        {       
            risultati[i]=new ResultVoiceObject(matches.get(i), score[i]);       
        }          
        ResultVoiceObject[] risultatiDaOrdinare= risultati;  // risultati contais ResultVoiceObject elements
                    /*sorting*/
        }

独自の文字列をランク付けして保持することでソートするにはどうすればよいですか?

どうもありがとう。

4

4 に答える 4

7
ResultVoiceObject[] objects = ...
Arrays.sort(objects, new Comparator<ResultVoiceObject>() {

    @Override
    public int compare(ResultVoiceObject arg0, ResultVoiceObject arg1) {
        return Float.compare(arg0.getRanking(), arg1.getRanking());
    }

});
于 2013-06-18T08:41:09.773 に答える
3

getRanking()private フィールドのアクセサーがあると仮定しますranking

public class ResultComparator implements Comparator<ResultVoiceObject> {
  public int compare(ResultVoiceObject r1, ResultVoiceObject r2) {
    float f1 = r1.getRanking();
    float f2 = r2.getRanking();
    if(f1 > f2) return 1;
    else if(f1 < f2) return -1;
    return 0;
  }

}

Arrays.sort(resultsArray, new ResultComparator());
于 2013-06-18T08:37:43.667 に答える
3

インターフェイスを実装する必要がありComparatorます。を使用しているときに、複数の並べ替え順序を作成できますComparator

ランキングに従って配列をソートし、実装する別のクラスを作成するとします。Comparator

public Class RankingSorter implements Comparator<ResultVoiceObject> {
   public int compare(ResultVoiceObject one, ResultVoiceObject another){
       return (int)(one.getRanking() - another.getRanking());
   }
}

次に、配列を並べ替えたい新しいクラスで、のオブジェクトを作成し、comparatorそれをコレクションに渡します

RankingSorter rs = new RankingSorter();
Collections.sort(yourArray, rs);

sortこれは、 を受け取るメソッドのオーバーロードされたバージョンですcomparator

少し前にこれに関する完全なチュートリアルを書きました http://www.dreamincode.net/forums/topic/174322-the-comparable-and-comparator-interface-part-ii/

これが ResultVoicObject クラスです

package com.compare;

public class ResultVoiceObject {

private String frase;
private float ranking;

public ResultVoiceObject(String f, float r) {
    this.frase = f;
    this.ranking = r;
}

public String getFrase() {
    return frase;
}

public void setFrase(String frase) {
    this.frase = frase;
}

public float getRanking() {
    return ranking;
}

public void setRanking(float ranking) {
    this.ranking = ranking;
}

@Override
public String toString() {
    return "ResultVoiceObject [frase=" + frase + ", ranking=" + ranking
            + "]";
}

}

次のようにインターフェイスを実装します。メソッドComparatorを実装する必要がありますcompare

 package com.compare;

 import java.util.Comparator;

  public class RankingSort implements Comparator<ResultVoiceObject> {

public int compare(ResultVoiceObject one, ResultVoiceObject another){
    return (int) (one.getRanking() - another.getRanking());
}
  }

以下のようにテストできます。

 package com.compare;

 import java.util.ArrayList;
 import java.util.Collections;

 public class RankingSorterTest{

public static void main(String [] args){

    ArrayList<ResultVoiceObject> list = new ArrayList<ResultVoiceObject>();
    list.add(new ResultVoiceObject("one", 1));
    list.add(new ResultVoiceObject("five", 5));
    list.add(new ResultVoiceObject("three", 3));

    Collections.sort(list,new RankingSort());
    System.out.println(list);

}
  }

Frase を使用して並べ替えシーケンスを作成する場合は、そのための新しいcomparatorクラスを作成し、上で並べ替えたように並べ替えるだけです。

これが役立つことを願っています...私も多くの努力をしました:D:D

于 2013-06-18T08:43:22.920 に答える
0

両方のアンサーをマージして解決しました:

public class VoiceRecognitionDemo extends Activity implements Comparator<ResultVoiceObject {

protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
        ...
        ResultVoiceObject[] risultati= ...;     
        Arrays.sort(risultati, new Comparator<ResultVoiceObject>() {
            @Override
            public int compare(ResultVoiceObject arg0, ResultVoiceObject arg1) {
                return Float.compare(arg0.getRanking(), arg1.getRanking());
            }
        });  

    }


public int compare(ResultVoiceObject lhs, ResultVoiceObject rhs) {
    // TODO Auto-generated method stub
    return 0;
}

}

どこ:

 public class ResultVoiceObject
 {

 private  String frase;
 private float ranking;
 public ResultVoiceObject(String f, float r) 
   {
    this.frase=f;
    this.ranking= r;
   }  
 }

別の方法は次のとおりです。

追加

java.util.Arrays をインポートします。

java.util.Comparator をインポートします。

REMOVE: Comparator と onActivityResult の比較メソッドを実装します。

スタックオーバーフロー コミュニティに感謝します。

于 2013-06-18T09:04:29.833 に答える