Assuming "Mango|Banana|Pear|Orange"
fixed, I would go about it "like that":
import java.util.Arrays;
import java.util.Collection;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.TreeSet;
public class Test {
public static void main(String[] args) {
System.out.println(sortIndiv());
}
// choose "richer" datastructure: fruit name as key, sort order as value:
public static final Map<String, Integer> VALID_FRUITS = Map.of(
"Mango", 0,
"Banana", 1,
"Pear", 2,
"Orange", 3);//want to maintain this order
// Map.of(k,v,k,v,...) -> java >= 9
// a "more generalized" result type: Collection<String>
public static Collection<String> sortIndiv() {
List<String> retriveFruits = Arrays.asList(
new String[]{"Pear",
"Apple", "Banana", "Orange", "Mango", "Papaya"}
); // fix values for test purpose, otherwise ... dao.fruitList ...
//here "the magic"...
//A (self-sorting) TreeSet with a custom comparator
//..using VALID_FRUITS:
Collection<String> result = new TreeSet<>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return VALID_FRUITS.get(o1).compareTo(VALID_FRUITS.get(o2)); // == FRUITS.get(o1) - FRUITS.get(o2);
}
});
// iterate: O(n)
for (String fruit : retriveFruits) {
// filter valids:
if (VALID_FRUITS.containsKey(fruit)) {
// add to result O(log(n))!
result.add(fruit);
}
//so after sorting names should maintian the order final String Fruits ="Mango|Banana|Pear|Orange"; how do I achieve this
}
//done!
return result;
}
}
Output:
[Mango, Banana, Pear, Orange]
If Collection
is not an acceptable return/result type (esp. when result contains/should contain duplicates, the TreeSet approach is not acceptable), then ArrayList
and sort()
can do the job comparably efficient (and allow duplicates):
import java.util.*;
public class Test {
public static void main(String[] args) {
List<String> retriveFruits = Arrays.asList(
new String[]{"Pear",
"Apple", "Banana", "Orange", "Mango", "Papaya", "Mango", "Mango"}
); // dao.fruitList ...
System.out.println(sortIndivSortedSet(retriveFruits));
System.out.println(sortIndivQuickSort(retriveFruits));
}
public static final Map<String, Integer> VALID_FRUITS = Map.of("Mango", 0, "Banana", 1, "Pear", 2, "Orange", 3);
//want to maintain this order
private static Comparator<String> customComparator() {
return new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return VALID_FRUITS.get(o1).compareTo(VALID_FRUITS.get(o2)); // == FRUITS.get(o1) - FRUITS.get(o2);
}
};
}
public static Collection<String> sortIndivSortedSet(List<String> retriveFruits) {
Collection<String> result = new TreeSet<>(customComparator());
for (String fruit : retriveFruits) {
if (VALID_FRUITS.containsKey(fruit)) {
result.add(fruit);
}
}
return result;
}
public static List<String> sortIndivQuickSort(List<String> retriveFruits) {
List<String> result = new ArrayList<>(retriveFruits.size());
// O(n)
for (String fruit : retriveFruits) {
if (VALID_FRUITS.containsKey(fruit)) {
// x
// O(1)
result.add(fruit);
}
}
// +
// O(n log(n))
result.sort(customComparator());
return result;
}
}
Ouput:
[Mango, Banana, Pear, Orange]
[Mango, Mango, Mango, Banana, Pear, Orange]