Изучив различные решения на разных форумах и не найдя подходящего решения, я чувствую, что я получил нижний взломанный код, который проще всего отслеживать и кодировать:
Пример. Предположим, у вас есть несколько параметров для перейдите в предложение «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», чтобы убедиться, что в запросе нет такого слова. Надеюсь, вы получили решение.
Примечание. Хотя это не подготовленный запрос, он выполняет работу, которую я хотел, чтобы мой код выполнял.
Не то, чтобы мой ответ мог быть или не быть более «эффективным», но когда я прочитал ваш код, вы подсчитали, сколько цифр в вашем номере, чтобы вы могли определить, насколько велики сделать ваш массив, а затем вы рассчитали, как верните свой массив в отсортированное целое число.
Мне кажется, что вы захотите написать свой собственный код, который выполнил сортировку без использования встроенных функций, что и делает мой образец. Кроме того, я добавил возможность сортировки в порядке возрастания или убывания, что также легко добавить в ваш код.
Оригинальный алгоритм отсортировал цифры, теперь это сортирует цифры так, чтобы конечный результат был самым большим или наименьшим в зависимости от второго переданного параметра. Однако при работе с отрицательным числом второй параметр рассматривается как противоположный.
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
Я отправляю этот второй ответ, потому что думаю, что у меня самый эффективный алгоритм для всех (спасибо за помощь 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;
}
Этот фрагмент кода ниже извлекает цифры из переменной v. Вы можете изменить его для хранения цифр в массиве и сортировки / реверса.
int v = 2345;
while (v > 0) {
int digit = v % 10;
v = v / 10;
Console.WriteLine(digit);
}
Вы можете использовать аналогичную логику для восстановления числа из (отсортированные) цифры: умножьте на 10 и добавьте следующую цифру.
Вы можете использовать этот код:
var digit = 2927466;
String.Join("", digit.ToString().ToCharArray().OrderBy(x => x));
Или
var res = String.Join("", digit.ToString().ToCharArray().OrderByDescending(x => x) );
int counter[10]
без какой-либо сортировки. – Alexei Levenkov 27 May 2015 в 02:41-99854322
- действительно самое большое возможное число --29985432
определенно больше, чем это ... – Alexei Levenkov 27 May 2015 в 02:43