M-K
M-K

Reputation: 39

Sorting Array List containing strings and integers

If I have an ArrayList as the following:

["a 100", "b 32", "t 54", "u 1"] (numbers and letter are separated by space in each cell of the array list).

How can I sort it by numbers keeping each number with its corresponding letter?.

Upvotes: 1

Views: 2221

Answers (6)

John Kugelman
John Kugelman

Reputation: 361575

In Java 8, Comparator has a handful of static and default methods that make it easy to create custom comparators. For instance, you could create one that splits each string and converts the second word to an integer.

list.sort(Comparator.comparingInt(
    s -> Integer.parseInt(s.split(" ")[1])
));

Upvotes: 0

Abdulla Dlshad
Abdulla Dlshad

Reputation: 141

You can simply use swapping method just like in regular arrays. The only difference is that we use set(index, "value") method to update a specific string at specified index.

public static void sort (ArrayList<String> arr){    

    int N = arr.size();
    int E = N-1;
    String temp;
    boolean flag = true;

    while(flag){
        flag=false;

        for(int a = 0 ; a < E ; a++){
            if(Integer.parseInt(arr.get(a).substring(arr.get(a).indexOf(" ")+1)) > 
               Integer.parseInt(arr.get(a+1).substring(arr.get(a+1).indexOf(" ")+1))) {

                temp=arr.get(a);
                arr.set(a, arr.get(a+1));   
                arr.set(a+1, temp);

                flag=true;
            }   
        }
        E--;    
    }}

The sorting algorithm is bubble sort. I have used it due to simplicity. You can use any other sorting algorithm if you want.

Then, you can call the sort() function in main method:

    public static void main(String[] args) {

    ArrayList<String> arr = new ArrayList<String>();

    arr.add("a 98");
    arr.add("a 23");
    arr.add("c 11");

    sort(arr);
}

Upvotes: 1

Assuming the elements in the list are the same pattern:

then you can do

public static void main(String[] args) {
    //  ["a 100", "b 32", "t 54", "u 1"]
    List<String> myList = new ArrayList<>();
    myList.add("a 100");
    myList.add("b 32");
    myList.add("t 54");
    myList.add("u 1");
    System.out.println("List unsorted" + myList);
    Collections.sort(myList, new Comparator<String>() {

        @Override
        public int compare(String o1, String o2) {
            try {
                int a1 = Integer.parseInt(o1.substring(2));
                int a2 = Integer.parseInt(o2.substring(2));
                return Integer.compare(a1,a2);
            } catch (NumberFormatException ex) {
                return 0;
            }
        }
    });
    System.out.println("List sorted" + myList);
}

Upvotes: 1

Andrew
Andrew

Reputation: 49606

import static java.lang.Integer.*;

Just import static Integer methods and you'll get the most compact Comparator<String> for your purpose.

(a, b) -> compare(valueOf(a.split(" ")[1]), valueOf(b.split(" ")[1]));

Upvotes: 1

Tobb
Tobb

Reputation: 12180

This looks like you are trying to implement object oriented programming using strings. Luckily, Java has already done this.

So, do something like this instead:

public class MyClass implements Comparable<MyClass> {
    private final String aString; //could be char perhaps..
    private final Integer anInteger;

    public MyClass(final String aString, final Integer anInteger) {
        this.aString = aString;
        this.anInteger = anInteger;
    }

    public String getAString() { return aString; }
    public Integer getAnInteger() { return anInteger; }

    public String toString() { return anInteger + " " + aString }

    //comparison by number
    public int compareTo(final MyClass other) {
        return anInteger.compareTo(other.anInteger);
    }
}

Then, you use it like this:

final List<MyClass> myClasses = new ArrayList<>();
myClasses.add(new MyClass("a", 100));
myClasses.add(new MyClass("b", 32));
myClasses.add(new MyClass("t", 54));
myClasses.add(new MyClass("u", 1));

Collections.sort(myClasses);

Upvotes: 3

Robin Jonsson
Robin Jonsson

Reputation: 2851

Use a custom comparator to sort the list.

List<String> yourList = Arrays.asList("a 100", "b 32", "t 54", "u 1");
yourList.sort((entry1, entry2) -> {
    int number1 = Integer.parseInt(entry1.split(" ")[1]);
    int number2 = Integer.parseInt(entry2.split(" ")[1]);

    return Integer.compare(number1, number2);
});

Regards

Upvotes: 1

Related Questions