I have a float array and a String array. each float value match with a specific String. I would like to sort the float array keeping the own string using :
Assuming you have a getRanking() accessor for the private field 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());
ResultVoiceObject[] objects = ...
Arrays.sort(objects, new Comparator<ResultVoiceObject>() {
@Override
public int compare(ResultVoiceObject arg0, ResultVoiceObject arg1) {
return Float.compare(arg0.getRanking(), arg1.getRanking());
}
});
I solved merging both answare:
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;
}
}
Where:
public class ResultVoiceObject
{
private String frase;
private float ranking;
public ResultVoiceObject(String f, float r)
{
this.frase=f;
this.ranking= r;
}
}
Another way is:
ADD
import java.util.Arrays;
import java.util.Comparator;
REMOVE: implements Comparator and the compare methos out onActivityResult
Thanks stackoverflow comunity!
You need to implement the Comparator interface. You can create multiple sort sequences while using Comparator.
Suppose you want to sort your array according to your ranking, then create a separate class which implements Comparator
public Class RankingSorter implements Comparator<ResultVoiceObject> {
public int compare(ResultVoiceObject one, ResultVoiceObject another){
return (int)(one.getRanking() - another.getRanking());
}
}
Then in the new class that you want to sort your array,
You create the object of the comparator and pass it to collection
RankingSorter rs = new RankingSorter();
Collections.sort(yourArray, rs);
This is the overloaded version of sort method which takes the comparator.
I had written a full tutorial regarding this a while ago http://www.dreamincode.net/forums/topic/174322-the-comparable-and-comparator-interface-part-ii/
Here is the ResultVoicObject class
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
+ "]";
}
}
Implement the Comparator interface as follows, you need to implement compare method
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());
}
}
You can test it as below.
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);
}
}
If you want to create a sorting sequence using frase, then you just need to create a new comparator class for it and sort just as I have sorted above
Hope this helps... took a lot of efforts from me also :D :D