2016-09-18 6 views
0

есть проблема, которая дает мне случайное число в качестве поворота, и мне нужно отсортировать мой массив w.r.t на этом своде (ближайший на первом месте, затем самый дальний) , например.Вариант сортировки/алгоритм сортировки подсчета

array =[2,7,4,6,4,4,5,3,6,9,1,1,9] and 

    pivot=5 

    expected output: [5,4,4,6,6,3,7,2,1,1,9,9] 

Это вариация подсчета сортировки, если это возможно? если не ! может ли кто-нибудь дать мне ключ к решению этой проблемы? Я встречая заграждение, думая о том, как обрабатывать счетчики и индексы массива Таким образом, до сих пор я был в состоянии сделать это

class HelloEclipse{ 

public static void main(String[] args) { 
    Scanner sc=new Scanner(System.in); 
    int N=sc.nextInt(); 
    int pivot=sc.nextInt(); 
    int[] mainArray=new int[N]; 
    int[] differenceArray=new int[N]; 
    int[] differnceCountArray=new int[Integer.MAX_VALUE]; 
    for(int i=0;i<N;i++){ 
     mainArray[i]=sc.nextInt(); 
     differenceArray[i]=pivot-mainArray[i]; 
     if(differenceArray[i]>0){ 
     differnceCountArray[differenceArray[i]]++;} 
     else{ 
      differnceCountArray[-differenceArray[i]]++; 
     } 

    } 
    } 
} 

Любые предложения о том, как действовать будет полезно!

+0

Почему бы не использовать Arrays.sort() для сортировки после заполнения разностного массива – brijs

+0

Каков возможный диапазон элементов массива? Являются ли они целыми и находятся на «разумном» расстоянии от стержня? –

+0

Проблема, с которой вы столкнулись с простым видом, заключается в том, что отрицательное * расстояние * неправильно отсортировано (в смысле проблемы). Сначала его нужно отсортировать по 'abs()', а затем по значению. Вероятно, вам нужно написать свой собственный «Компаратор». – PeterMmm

ответ

2

Написать подходящий Integer-компаратор и использовать Arays.sort:

public class PivotComparator implements Comparator<Integer> { 

    private int pivot; 

    public PivotComparator(int pivot) { 
     super(); 
     this.pivot = pivot; 
    } 

    @Override 
    public int compare(Integer a, Integer b) { 
     return Math.abs(a - pivot) - Math.abs(b - pivot); 
    } 

    public static void main(String[] args) { 

     Integer[] toSort = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 

     Comparator<Integer> comp = new PivotComparator(5); 

     Arrays.sort(toSort, comp); 
     for (Integer i : toSort) { 
      System.out.println(i); 
     } 

    } 

} 

EDIT

, чтобы получить все четвереньки перед шестерок вы могли бы сделать (вместо сортировки дважды)

public int compare(Integer a, Integer b) { 
    int diff = Math.abs(a - pivot) - Math.abs(b - pivot); 
    if (diff != 0) { 
     return diff; 
    } 
    return a - b; 
} 
+1

, чтобы убедиться, что я правильно понял, вы сделали дочерний класс «Компаратор» и переопределили его метод сравнения, и что при верховой езде ставится в порядок абсолютная разница от поворота элементов, и вы используете этот компаратор в качестве аргумента для массивов .sort(), пожалуйста, дайте мне знать, если я не полностью понял/неправильно понял что-либо! –

+0

Это реализация интерфейса, а не только дочернего класса (я подключаю дочерний класс к наследованию), но да к остальному. – Turo

+0

Это полностью исчерпывающее решение с редактированием, оно заботится о том, что до того, как только абсолютные расстояния были мерой для перечисления элементов (и порядка, в котором они были помещены в исходный массив), и не обязательно возвращали все экземпляры один номер перед следующим номером с одинаковыми расстояниями был возвращен, очень полезно! –

0

Вот реализация

int[] array = { 2, 7, 4, 6, 4, 4, 5, 3, 6, 9, 1, 1, 9 }; 
    int pivot = 5; 
    int[] sorted = Arrays.stream(array).boxed().sorted().sorted((i1, i2) -> Math.abs(i1 - pivot) - Math.abs(i2 - pivot)).mapToInt(i -> i).toArray(); 
    System.out.println(Arrays.toString(sorted)); 

выход

[5, 4, 4, 4, 6, 6, 3, 7, 2, 1, 1, 9, 9] 
+0

не осведомлен о потоках и связанных с ними методах, поэтому его немного сложно понять подходом, не могли бы вы попытаться разработать хотя бы подход и кратко, как поток помогает в подходе? Или это то, что мне нужно изучить? , хотя маленький намек был бы чрезвычайно полезен! Ваша реализация прекрасна и проверена и для других случаев! –

Смежные вопросы