Java: Сортування масиву відповідно до відповідного рядка/шаблону

Мені потрібно відсортувати масив, в якому з'являються відповідні елементи, а інші знижуватимуться.

For Ex. I have an Array : [ z , asxdf , abasdf , abcasdf , b , bc , bcd , c ] What I need is when I pass a KeyWord suppose "b" , then it should sort the given array in which all the string starting with b.. will come first and the rest after that. Which will generate final output : [ b , bc , bcd , z , c , .. (rest).]

Якщо це можливо за допомогою компаратора на Java?

String keyWord = "b";
String[] s = {"z", "asxdf", "abasdf", "abcasdf", "b", "bc", "bcd", "c"};
Arrays.sort(s, new Comparator() {

    @Override
    public int compare(String o1, String o2) {

            //Code to sort array according to need

    }
});
System.out.println(Arrays.toString(s));

Result -> [ b , bc , bcd , z , c , ...]

(Я можу використовувати список замість масиву, або будь-який інший, якщо це допоможе мені вирішити цю проблему)

4
Так що ви хочете, щоб ми зробили алгоритм порівняння для вас?
додано Автор Luiggi Mendoza, джерело
Чи повинен алгоритм бути стабільним, тобто. порядок елементів у кожній з 2 груп повинен бути таким же, як у вихідному масиві?
додано Автор user829755, джерело
що ви маєте на увазі під "найкращими матчами"? або вони збігаються, або ні.
додано Автор user829755, джерело
додано Автор Shreyas Dave, джерело
Найкращим збігом 'b' буде 'b', 'bc' та 'bcd'. 'Bc' буде 'bc' та 'bcd'.
додано Автор Shreyas Dave, джерело
Ні, але пріоритет буде для тих, хто найкраще відповідає ключовому слову.
додано Автор Shreyas Dave, джерело
Так, якщо це не завдає вам шкоди. Але якщо ви знову прочитали моє запитання, ви побачите, що я запитав "Якщо це можливо за допомогою компаратора на Java?".
додано Автор Shreyas Dave, джерело

7 Відповіді

Відповідаючи на питання, чи можна це зробити за допомогою компаратора, відповідь так: потрібно просто створити новий клас Comparator замість створення анонімного компаратора, наприклад:

    class MyComparator implements Comparator {

        private final String keyWord;

        MyComparator(String keyWord) {
            this.keyWord = keyWord;
        }

        @Override
        public int compare(String o1, String o2) {

            if(o1.startsWith(keyWord)) {
                return o2.startsWith(keyWord)? o1.compareTo(o2): -1;
            } else {
                return o2.startsWith(keyWord)? 1: o1.compareTo(o2); 
            }
        }
    }

а потім використовуйте цей компаратор у коді:

    String keyWord = "b";
    String[] s = {"z", "asxdf", "abasdf", "abcasdf", "b", "bc", "bcd", "c"};
    Arrays.sort(s, new MyComparator(keyWord));
    System.out.println(Arrays.toString(s));
10
додано
Я мав аналогічний підхід. Ви б'єте мене! ;)
додано Автор Vishnu Prasad Kallummel, джерело

Оскільки довжина рядків після відповідності ключових слів має значення, ось моя версія:

Arrays.sort(s, new Comparator() {

    @Override
    public int compare(String o1, String o2) {

        boolean o1Has = o1.startsWith( keyWord );
        boolean o2Has = o2.startsWith( keyWord );

        if( o1Has && !o2Has  ) return -1;
        else if( o2Has && !o1Has ) return 1;
        else if( o1Has && o2Has ) return 0;
        else
            return o1.length() - o2.length();
    }
});

Вихід:

[b, bc, bcd, z, c, asxdf, abasdf, abcasdf]

3
додано
@ n0741337 Велике спасибі! Це спрацювало :)
додано Автор Woppi, джерело
+1 Це працює, спасибі.
додано Автор Shreyas Dave, джерело

Я також додам, що ви можете прочитати про Comparator та Comparable у цьому посібнику Oracle http://docs.oracle.com/javase/tutorial/collections/interfaces/order.html .

1
додано
Дякуємо за посилання, обов'язково прочитайте його.
додано Автор Shreyas Dave, джерело
final String keyWord = "b";
String[] s = {"z", "asxdf", "abasdf", "abcasdf", "b", "bc", "bcd", "c"};
Arrays.sort(s, new Comparator() {

    @Override
    public int compare(String o1, String o2) {

            boolean o1_has_keyWord = o1.indexOf(keyWord.charAt(0)) == 0 && o1.contains(keyWord);
            boolean o2_has_keyWord = o2.indexOf(keyWord.charAt(0)) == 0 && o2.contains(keyWord);

        if (o1_has_keyWord && o2_has_keyWord)
        {
            if (o1.length() == o2.length())
            {
                if (o1.indexOf(keyWord.charAt(0)) > o2.indexOf(keyWord.charAt(0))){
                    return -1;
                }
                else if (o1.indexOf(keyWord.charAt(0)) == o2.indexOf(keyWord.charAt(0))){
                    return 0;
                }
                else
                {
                    return 1;
                }
            }
            else if (o1.length() > o2.length())
            {
                    return 1;
            }
            else 
            {
                return -1;
            }
        }
        else if (o1_has_keyWord && !o2_has_keyWord)
        {
            return -1;
        }
        else if (!o1_has_keyWord && o2_has_keyWord)
        {
            return 1;
        }


        return 0;

            //Code to sort array according to need

    }
});
System.out.println(Arrays.toString(s));

Вихід:

[b, bc, bcd, z, asxdf, abasdf, abcasdf, c]
1
додано
Завдяки цьому чудово працює, але проблема полягає в тому, що вона працює так само для ключових слів = 'b', 'bc' і 'bcd' ..
додано Автор Shreyas Dave, джерело
Я думав, ви просто хочете використовувати один символ для ключових слів. Я буду оновлювати для рядка, що використовується як ключове слово
додано Автор Keane_zhou, джерело

тільки тому, що він коротший:

@Override
public int compare(String o1, String o2) {
    boolean firstMatches = o1.startsWith(keyWord);
    boolean secondMatches = o2.startsWith(keyWord);
    if (firstMatches != secondMatches) {
        return firstMatches ? -1 : 1;
    }
    return 0; //or refine the sort sort here
}
0
додано
вибачте, виправлена ​​помилка (o1 було використано двічі, а o2 взагалі не було)
додано Автор user829755, джерело
вибачте, але це не працює.
додано Автор Shreyas Dave, джерело
Чи подбає це про цей висновок? [b, bc, bcd, z, c, asxdf, abcasdf, abasdf] Вибачте, що це не працює.
додано Автор Vishnu Prasad Kallummel, джерело

Перевірте наступне

package com.pantech.sam.demos;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

public class SortArray {

/**
 * @param args
 */
private final static char keyWord = 'b';

public static void main(String[] args) {
   //TODO Auto-generated method stub
    String[] s = {"z", "asxdf", "abasdf", "abcasdf", "b", "bc", "bcd", "c"};

    System.out.println("FIRST WAY " + sortArray(s));

    Arrays.sort(s, new CustomeComparator(keyWord));
    System.out.println("SECOND WAY" + Arrays.toString(s));

}

static List sortArray(String[] sArray){
    Arrays.sort(sArray) ;
    List l1 = Arrays.asList(sArray);
    List l2 = new ArrayList(l1.size());
    int index = 0;
    for (String str : l1) {
        if (str.charAt(0) == keyWord) {
            l2.add(index++,str);//add at start
        }else{
            l2.add(l2.size(), str);//add at end
        }

    }
    return l2;
}

}


class CustomeComparator implements Comparator {
private final char keyWord;

CustomeComparator(char keyword2) {
    this.keyWord = keyword2;
}


@Override
public int compare(String o1, String o2) {
   //TODO Auto-generated method stub
      if(o1.charAt(0) == (keyWord)) {
            return o2.charAt(0) == (keyWord)? o1.compareTo(o2): -1;
        } else {
            return o2.charAt(0) == (keyWord)? 1: o1.compareTo(o2); 
        }   }
}
0
додано

Як щодо:

List result = new ArrayList();
for(int i=0;i
0
додано
Дякуємо за ваші зусилля, але мені потрібно порівняти і сортувати() метод.
додано Автор Shreyas Dave, джерело
ІТ КПІ - Java
ІТ КПІ - Java
436 учасників