Как отсортировать номер int? [Дубликат]

Изучив различные решения на разных форумах и не найдя подходящего решения, я чувствую, что я получил нижний взломанный код, который проще всего отслеживать и кодировать:

Пример. Предположим, у вас есть несколько параметров для перейдите в предложение «IN». Просто поместите фиктивную строку в предложение «IN», скажем, «PARAM» обозначить список параметров, которые будут появляться на месте этой фиктивной строки.

    select * from TABLE_A where ATTR IN (PARAM);

Вы можете собрать все параметров в одну переменную String в вашем Java-коде. Это можно сделать следующим образом:

    String param1 = "X";
    String param2 = "Y";
    String param1 = param1.append(",").append(param2);

Вы можете добавить все ваши параметры, разделенные запятыми, в одну переменную String, 'param1', в нашем случае.

После сбора всех параметры в одну строку вы можете просто заменить фиктивный текст в вашем запросе, то есть «PARAM» в этом случае, с параметром String, т. е. param1. Вот что вам нужно сделать:

    String query = query.replaceFirst("PARAM",param1); where we have the value of query as 

    query = "select * from TABLE_A where ATTR IN (PARAM)";

Теперь вы можете выполнить свой запрос с помощью метода executeQuery (). Просто убедитесь, что в вашем запросе нет слова «PARAM». Вы можете использовать комбинацию специальных символов и алфавитов вместо слова «PARAM», чтобы убедиться, что в запросе нет такого слова. Надеюсь, вы получили решение.

Примечание. Хотя это не подготовленный запрос, он выполняет работу, которую я хотел, чтобы мой код выполнял.

0
задан yq8 27 May 2015 в 00:30
поделиться

4 ответа

Не то, чтобы мой ответ мог быть или не быть более «эффективным», но когда я прочитал ваш код, вы подсчитали, сколько цифр в вашем номере, чтобы вы могли определить, насколько велики сделать ваш массив, а затем вы рассчитали, как верните свой массив в отсортированное целое число.

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

UPDATED

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

using System;

public class Program
{
    public static void Main()
    {
        int number1 = 2927466;
        int number2 = 12492771;
        int number3 = -39284925;

        Console.WriteLine(OrderDigits(number1, false));
        Console.WriteLine(OrderDigits(number2, true));
        Console.WriteLine(OrderDigits(number3, false));
    }

    private static int OrderDigits(int number, bool asc)
    {   
        // Extract each digit into an array
        int[] digits = new int[(int)Math.Floor(Math.Log10(Math.Abs(number)) + 1)];
        for (int i = 0; i < digits.Length; i++)
        {
            digits[i] = number % 10;
            number /= 10;
        }

        // Order the digits
        for (int i = 0; i < digits.Length; i++)
        {
            for (int j = i + 1; j < digits.Length; j++)
            {               
                if ((!asc && digits[j] > digits[i]) ||
                    (asc && digits[j] < digits[i]))
                {
                    int temp = digits[i];
                    digits[i] = digits[j];
                    digits[j] = temp;
                }
            }
        }

        // Turn the array of digits back into an integer
        int result = 0;     
        for (int i = digits.Length - 1; i >= 0; i--)
        {
            result += digits[i] * (int)Math.Pow(10, digits.Length - 1 - i);
        }

        return result;
    }
}

Результаты:

9766422
11224779
-22345899

См. рабочий пример здесь ... https://dotnetfiddle.net/RWA4XV

2
ответ дан Shar1er80 17 August 2018 в 08:57
поделиться
  • 1
    +1 + Ответил за этот ответ! Чрезвычайно приятный алгоритм, очень хорошая работа! :) Это намного лучше, чем у меня! – yq8 27 May 2015 в 02:29
  • 2
    @ yq8 обратите внимание, что вы также должны попробовать сортировку в bucket - вместо того, чтобы сортировать цифры, подсчитайте их, в конце у вас есть массив из числа каждой цифры 0-9 в соответствующих элементах int counter[10] без какой-либо сортировки. – Alexei Levenkov 27 May 2015 в 02:41
  • 3
    Shar1er80 - Я не уверен, что -99854322 - действительно самое большое возможное число - -29985432 определенно больше, чем это ... – Alexei Levenkov 27 May 2015 в 02:43
  • 4
    @AlexeiLevenkov Принял во внимание комментарии. Мой первоначальный алгоритм сортировал только цифры и не учитывал, что в результате получается наибольшее число. Ответ обновлен. – Shar1er80 27 May 2015 в 03:00

Я отправляю этот второй ответ, потому что думаю, что у меня самый эффективный алгоритм для всех (спасибо за помощь Atul):)

void Main()
{
    Console.WriteLine (ReorderInt32Digits2(2927466));
    Console.WriteLine (ReorderInt32Digits2(12492771));      
    Console.WriteLine (ReorderInt32Digits2(-1024));
}

public static int ReorderInt32Digits2(int v)
{
    bool neg = (v < 0);
    int mult = neg ? -1 : 1;
    int result = 0;
    var counts = GetDigitCounts(v);
    for (int i = 0; i < 10; i++)
    {
        int idx = neg ? 9 - i : i;
        for (int j = 0; j < counts[idx]; j++)
        {
            result += idx * mult;
            mult *= 10;         
        }
    }
    return result;
}

// From Atul Sikaria's answer
public static int[] GetDigitCounts(int n)
{
    int v = Math.Abs(n);
    var result = new int[10];
    while (v > 0) {
        int digit = v % 10;
        v = v / 10;
        result[digit]++;
    }
    return result;
}
1
ответ дан Aaron Anodide 17 August 2018 в 08:57
поделиться

Этот фрагмент кода ниже извлекает цифры из переменной v. Вы можете изменить его для хранения цифр в массиве и сортировки / реверса.

int v = 2345;

while (v > 0) {
   int digit = v % 10;
   v = v / 10;
   Console.WriteLine(digit);
}

Вы можете использовать аналогичную логику для восстановления числа из (отсортированные) цифры: умножьте на 10 и добавьте следующую цифру.

1
ответ дан Atul Sikaria 17 August 2018 в 08:57
поделиться

Вы можете использовать этот код:

var digit = 2927466;
String.Join("", digit.ToString().ToCharArray().OrderBy(x => x));

Или

var res = String.Join("", digit.ToString().ToCharArray().OrderByDescending(x => x) );
6
ответ дан Peyman 17 August 2018 в 08:57
поделиться
  • 1
    Спасибо за ответ, но, как указано выше, я ищу решение, отличное от Linq, которое быстрее моего. Кроме того, ваш алгоритм преобразует цифру в строку, которую я также хотел бы избежать, если это возможно, как упоминалось ранее :) – yq8 27 May 2015 в 00:43
  • 2
    Добро пожаловать @ yq8, извините, я этого не видел. Есть ли причина, по которой вы не хотите использовать Linq? – Peyman 27 May 2015 в 00:44
  • 3
    Ваш результат также возвращает int в наименьшем порядке, который не самый высокий. – deathismyfriend 27 May 2015 в 01:01
Другие вопросы по тегам:

Похожие вопросы: