user2012751
user2012751

Reputation: 153

How would I sort an ArrayList based on how another ArrayList acts? (java)

Here's ultimately what I need to do:

I have an ArrayList called originalList that looks like [pans, pots, sit, it's, naps]

and another ArrayList called modifiedList that takes originalList and removes punctuation and uppercase and then sorts the list. So it would look like [anps, anps, ist, ist, opst]

modifiedList's purpose is to tell me what words are anagrams of each other. An anagram is a word that consist of the same letters. The problem is I need to sort originalList to match modifiedList so that I can output what words are anagrams of each other. originalList would need to become [pans, naps, sit, it's, pots]. Suggestions?

Upvotes: 3

Views: 433

Answers (2)

Ravindra Gullapalli
Ravindra Gullapalli

Reputation: 9178

public static void main(String args[]){
        ArrayList<String> alOriginal = new ArrayList<String>();
        alOriginal.add("pans");
        alOriginal.add("pots");
        alOriginal.add("sit");
        alOriginal.add("it's");
        alOriginal.add("naps");
        ArrayList<String> alAnagram = getSortedAnagramStrings(alOriginal);
        System.out.println(alOriginal);
        System.out.println(alAnagram);
    }
    public static java.util.ArrayList<String> getSortedAnagramStrings(ArrayList<String> original){
        ArrayList<String> alAnagramStrings = new ArrayList<String>();
        for (String currentString : original) {
            //  Remove punctuation
            char[] anagramChars = currentString.replace("'", "").toCharArray();
            //  Sort characters
            Arrays.sort(anagramChars);
            //  Prepare string
            String anagramString = new String(anagramChars);
            //  Add to array list
            alAnagramStrings.add(anagramString);
        }
        //  Simple sort logic
        for (int index = 0; index < alAnagramStrings.size(); index ++){
            for (int index1 = index + 1; index1 < alAnagramStrings.size(); index1 ++){
                //  If both anagram strings are same
                if(alAnagramStrings.get(index).compareTo(alAnagramStrings.get(index1)) == 0){
                    //  Compare original strings
                    if (original.get(index).compareTo(original.get(index1)) > 0){
                        String temp =original.get(index);
                        original.set(index, original.get(index1));
                        original.set(index1, temp);
                    }else{
                        String temp =original.get(index);
                        original.set(index1, original.get(index));
                        original.set(index, temp);
                    }
                }else if(alAnagramStrings.get(index).compareTo(alAnagramStrings.get(index1)) > 0){
                    String temp =alAnagramStrings.get(index);
                    alAnagramStrings.set(index, alAnagramStrings.get(index1));
                    alAnagramStrings.set(index1, temp);
                    String temp1 =original.get(index);
                    original.set(index, original.get(index1));
                    original.set(index1, temp1);
                }
            }
        }
        return alAnagramStrings;
    }

Upvotes: 1

JB Nizet
JB Nizet

Reputation: 692081

Don't use an additional list. Sort your original list using a comparator that "normalizes" the two words to compare, and then compares their normalized values (by normalizing, I mean transforming naps into anps).

You'll then have your anagrams next to each other in the list.

Upvotes: 5

Related Questions