Попробуйте этот ответ. Во-первых, данные:
int[] a = {1,2,3,4,5,6,7,7,7,7};
Здесь мы строим карту, подсчитывающую количество раз, когда появляется каждое число:
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int i : a) {
Integer count = map.get(i);
map.put(i, count != null ? count+1 : 0);
}
Теперь мы найдем число с максимальной частотой и возвращаем его:
Integer popular = Collections.max(map.entrySet(),
new Comparator<Map.Entry<Integer, Integer>>() {
@Override
public int compare(Entry<Integer, Integer> o1, Entry<Integer, Integer> o2) {
return o1.getValue().compareTo(o2.getValue());
}
}).getKey();
Как вы можете видеть, самым популярным номером является семь:
System.out.println(popular);
> 7
EDIT
Вот мой ответ без , используя карты, списки и т. д. и используя только массивы; хотя я сортирую массив на месте. Это сложность O (n log n), лучше, чем принятое решение O (n ^ 2).
public int findPopular(int[] a) {
if (a == null || a.length == 0)
return 0;
Arrays.sort(a);
int previous = a[0];
int popular = a[0];
int count = 1;
int maxCount = 1;
for (int i = 1; i < a.length; i++) {
if (a[i] == previous)
count++;
else {
if (count > maxCount) {
popular = a[i-1];
maxCount = count;
}
previous = a[i];
count = 1;
}
}
return count > maxCount ? a[a.length-1] : popular;
}
У меня наконец есть ответ для этого, которое, кажется, работает.
Компиляция оба 32 & версии на 64 бита - оба управляли & неуправляемый - в отдельные папки. Затем имейте приложение.NET, выбирают во время выполнения который каталог загрузить блоки из.
проблема с использованием ResolveEvent состоит в том, что это только называют, если блоки не найдены, таким образом, это - все к легкому для случайного окончания с версиями на 32 бита. Вместо этого используйте второй объект AppDomain, где мы можем изменить свойство ApplicationBase для указания на правильную папку. Таким образом, Вы заканчиваете с кодом как:
static void Main(String[] argv)
{
// Create a new AppDomain, but with the base directory set to either the 32-bit or 64-bit
// sub-directories.
AppDomainSetup objADS = new AppDomainSetup();
System.String assemblyDir = System.IO.Path.GetDirectoryName(Application.ExecutablePath);
switch (System.IntPtr.Size)
{
case (4): assemblyDir += "\\win32\\";
break;
case (8): assemblyDir += "\\x64\\";
break;
}
objADS.ApplicationBase = assemblyDir;
// We set the PrivateBinPath to the application directory, so that we can still
// load the platform neutral assemblies from the app directory.
objADS.PrivateBinPath = System.IO.Path.GetDirectoryName(Application.ExecutablePath);
AppDomain objAD = AppDomain.CreateDomain("", null, objADS);
if (argv.Length > 0)
objAD.ExecuteAssembly(argv[0]);
else
objAD.ExecuteAssembly("MyApplication.exe");
AppDomain.Unload(objAD);
}
Вы заканчиваете с 2 exes - Ваше нормальное приложение и второе приложение переключения, которое выбирает который биты загрузиться. Отметьте - я не могу приписать себе детали этого сам. Один из моих коллег разузнал это данное моя начальная подсказка. Если и когда он заключит контракт с StackOverflow, я присвою ответ ему
Я смог сделать это приблизительно год назад, но я больше не помню все детали. В основном можно использовать IntPtr. Размер для определения, который DLL загрузиться, затем выполните фактический LoadLibrary через p/Invoke. В той точке у Вас есть модуль в памяти, и необходимо быть в состоянии просто p/Invoke функции изнутри его - то же имя модуля не должно быть перезагружено снова.
я думаю, тем не менее, что в моем приложении на самом деле имел сам регистр DLL C++ как сервер COM и затем получил доступ к его функциональности через сгенерированную обертку.NET - таким образом, я не знаю, тестировал ли я когда-нибудь p/Invoking непосредственно.
Я встретился с подобным сценарием некоторое время назад. Инструментарий, который я использовал, не вел себя хорошо в 64-разрядной среде, и я не смог найти способ динамично вынудить блоки связать как 32 бита.
возможно вынудить Ваши блоки работать в режиме на 32 бита, но это требует исправления заголовка CLR, (существует инструмент, который делает это в Платформе), и если Ваши блоки сильно названы, это не удается.
я боюсь, что необходимо будет создать и опубликовать два набора двоичных файлов для платформ на 32 и 64 бита.