2014-11-10 4 views
0

Правильно, поэтому у меня есть алгоритм сортировки по 2 части. Все это основано на массиве из 14 случайных чисел. Например:Создание пользовательского сортировки для массива целых чисел?

int[] a = {9,2,4,8,9,4,3,2,8,1,2,7,2,5}; 

Теперь, первая вещь, которую я пытаюсь выяснить, как сделать это, чтобы подсчитать, сколько определенное количество существует в исходном массиве. Итак, мы знаем, что 1 существует один раз, а 2 существует четыре раза в исходном массиве. Но так просто, как визуально видеть это, что, если у нас нет доступа к исходному массиву. Поэтому мне нужно создать метод, который будет подсчитывать количество каждого числа 1-9 и помещать его в новый массив с именем count. Таким образом, индекс 0 в count будет представлять собой целое число 1 и будет иметь значение 1. Индекс 1 будет представлять собой целое число 2 и имеет значение 4. И так далее и т. Д. Вот что у меня есть, но я застрял. Сортировка для меня довольно сложна.

public static void main(String[] args) 
{ 
    // int[] countFinal = {1,4,1,2,1,0,1,2,2}; // The number of times a number 1-9 appears in a[]. 
    // int[] sortedFinal = {1,2,2,2,2,3,4,4,5,7,8,8,9,9}; // What we need as a final product. 
    int[] a = {9,2,4,8,9,4,3,2,8,1,2,7,2,5}; 
    //int[] count = {}; 
    int[] sorted = {}; 
    countHowMany(a, 1); 
    countHowMany(a, 2); 
    countHowMany(a, 3); 
    countHowMany(a, 4); 
    countHowMany(a, 5); 
    countHowMany(a, 6); 
    countHowMany(a, 7); 
    countHowMany(a, 8); 
    countHowMany(a, 9); 


} 

public static int countHowMany(int[] array, int value) 
{ 
    // Gathering a count for how many times a number 1-9 exists and adding it to count[]; 
    int howManyCount = 0; 
    for (int i = 0; i < array.length; i++) 
    { 
    if (array[i] == value) 
    { 
     howManyCount++; 
    } 
    } 
    System.out.println(howManyCount); 
    count = new int[9]; 
    count[howManyCount]; 
    System.out.println(Arrays.toString(count); // Testing the input 
    return howManyCount; 


} 

Похоже, что подсчет количества раз, когда элемент в массиве существует правильно. Теперь я просто должен выяснить, как добавить значение в новый массив count [] и сделать это для каждого countHowMany(). Это та часть, на которую я застрял.

Как только я вычислил счет [], я могу использовать его для создания отсортированного []. Теперь, что должно быть сделано, нужно взять данные из исходного массива и count [] и создать новый массив, который сортирует его в порядке возрастания и позволяет дублировать. Таким образом, поскольку 1 происходит один раз и 2 происходит четыре раза, новый массив будет сортироваться [] = {1, 2, 2, 2, 2, ...}

Это относительно небольшая программа и небольшое количество целые числа, поэтому вполне нормально, что я создаю массив по мере необходимости. Ключевым моментом является то, что я ограничен использованием массивов и не могу использовать для этого аргументы ArrayLists.

+1

Почему бы не использовать карту? – xuesheng

+0

Возможный дубликат [Количество экземпляров Java в каждом элементе массива] (http://stackoverflow.com/questions/8098601/java-count-occurrence-of-each-item-in-an-array) – dognose

+0

@xuesheng Для кто-то, кто просто узнает о массивах, «Карта» действительно не будет полезен. Гораздо лучше придерживаться основных идей, пока они не будут твердо закреплены, и только затем начнут использовать более продвинутые функции. –

ответ

2

Вам не нужно учитывать каждое значение отдельно. Вы можете просто перебирать весь массив и увеличивать счетчики для каждого элемента, когда вы его встретите.

int counts = new int[20]; // Choose a value that's bigger than anything in your array. 
int[] a = {9,2,4,8,9,4,3,2,8,1,2,7,2,5};  

for (int value : a) { 
    counts[value]++; 
} 

Если вы не знаете, что наибольшее значение в массиве, вероятно, будет, вам лучше использовать либо Map для хранения отсчетов, или какой-то List, что вы увеличить размер по мере необходимости.

+0

Я не знал, что вы можете это сделать. Я думал, тебе нужно пройти через это индивидуально. Однако примечание стороны добавляет 0 в качестве первого элемента в count. Я предполагаю, что это потому, что он проверяет значение 0, и нет никаких записей в []. Следует ли исключить этот индекс? –

+0

Обновление: задумано. Я изменил counts [значение] ++; считаться значением [value-1] ++; и я получил то, что мне было нужно. Теперь разобраться в сортировке. –

+0

Ну, все, что вам нужно сделать, это: (1) отменить внесенное вами изменение (2) итерировать по массиву 'counts' по индексу, распечатывая каждый индекс столько раз, сколько задает значение в массиве. –

0

Ты лучше просто идти через массив один раз и инкремент счетчика для каждого значения, которые могут появиться:

int counts[] = new int[10]; 
for (int n: array) 
    counts[n]++; 

Этого достаточно, чтобы поставить счетчик для каждого n в counts[n]. Затем вы можете прочитать значения из своего массива count[].

Возможно, вы не столкнулись с этим синтаксисом для цикла for над массивом. Это эквивалентно

int counts[] = new int[10]; 
for (int i=0; i<array.length; i++) { 
    int n = array[i]; 
    counts[n]++; 
} 

, но это менее подробный.

0

Ваш метод также может быть недействительным, поскольку вы ничего не делаете с возвращаемыми значениями функции countHowMany. Это будет сделать то, что вы хотите:

public static void main(String[] args) 
{ 
    int[] a = {9,2,4,8,9,4,3,2,8,1,2,7,2,5}; 

    //count the instances of each number in the array 
    int[] count = new int[9]; 
    for(int i = 0; i < count.length; i++) 
    count[i] = countHowMany(a, i+1); 

    //put the values in the sorted array 
    int[] sorted = new int[a.length]; 
    int position = 0; // stores the place in the array to put the new digit 
    for(int digit = 0; digit < 9; digit++) 
    { 
    for(int inst = 0; inst < count[digit]; inst++) 
    { 
     sorted[position] = digit + 1; 
     position++; 
    } 
    } 

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

Проблема с кодом является то, что вы пытаетесь создать массив подсчета в каждом вызове метода countHowMany, но этот массив будет уничтожен после того, как метод отделки.Вызов метода должен просто возвращать счетчики, а затем эти возвращения должны быть помещены в массив count вне метода. Обратите внимание, однако, что есть другие способы подсчета количества экземпляров каждого значения, как отмечалось в других ответах.

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