То, как поздно связать 32bit/64, укусило, освобождает во времени выполнения

Попробуйте этот ответ. Во-первых, данные:

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;

}
17
задан Community 23 May 2017 в 10:27
поделиться

3 ответа

У меня наконец есть ответ для этого, которое, кажется, работает.

Компиляция оба 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, я присвою ответ ему

8
ответ дан 30 November 2019 в 14:29
поделиться

Я смог сделать это приблизительно год назад, но я больше не помню все детали. В основном можно использовать IntPtr. Размер для определения, который DLL загрузиться, затем выполните фактический LoadLibrary через p/Invoke. В той точке у Вас есть модуль в памяти, и необходимо быть в состоянии просто p/Invoke функции изнутри его - то же имя модуля не должно быть перезагружено снова.

я думаю, тем не менее, что в моем приложении на самом деле имел сам регистр DLL C++ как сервер COM и затем получил доступ к его функциональности через сгенерированную обертку.NET - таким образом, я не знаю, тестировал ли я когда-нибудь p/Invoking непосредственно.

3
ответ дан 30 November 2019 в 14:29
поделиться

Я встретился с подобным сценарием некоторое время назад. Инструментарий, который я использовал, не вел себя хорошо в 64-разрядной среде, и я не смог найти способ динамично вынудить блоки связать как 32 бита.

возможно вынудить Ваши блоки работать в режиме на 32 бита, но это требует исправления заголовка CLR, (существует инструмент, который делает это в Платформе), и если Ваши блоки сильно названы, это не удается.

я боюсь, что необходимо будет создать и опубликовать два набора двоичных файлов для платформ на 32 и 64 бита.

1
ответ дан 30 November 2019 в 14:29
поделиться
Другие вопросы по тегам:

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