Страницы

Поиск по вопросам

воскресенье, 15 декабря 2019 г.

Vector, Hashtable. В чем минус синхронизированности?

#java #коллекции #concurrency


Vector, HashTable, Stack являются устаревшими коллекциями, и пишут что их не используют
в виду синхронизированности их методов. В чем минус синхронизации? Если однопоточная
среда, это как-то влияет на их работу? Потокобезопасность это же хорошо. Если они устаревшие,
зачем создавали синхронизированные коллекции в concurrent пакете? 
Извините за тупой вопрос, очень интересно просто. Заранее спасибо.
    


Ответы

Ответ 1



Потокобезопасность это же хорошо. Потокобезопасность не бесплатна, точнее очень не бесплатна, именно поэтому есть потокобезопасные и не потокобезопасные коллекции. Если однопоточная среда, это как-то влияет на их работу? Такие коллекции работают значительно медленее, чем не синхронизированные аналоги Если они устаревшие, зачем создавали синхронизированные коллекции в concurrent пакете? Новые синхронизированные коллекции используют более быстрый алгоритм, когда блокируется не вся коллекция целиком при каждом чихе, а только часть (блок), поэтому Vector, HashTable, Stack не стоит использовать ни в многопоточности (они работают медленнее, чем новые коллекции), ни в однопоточном - они просто избыточны. Если интересно более подробно разобраться с коллекциями советую посмотреть мою статью P.S. В принципе, если вам производительность не важна, то ничего страшного не случится если вы будите использовать Vector, HashTable и т.п. вместо ArrayList, HashMap и т.д., они будут работать нормально. Но их использование считается плохим кодом и признаком плохого знания языка.

Проверка на гласные и согласные буквы

#javascript #jquery


Если встречается согласная буква, то пропускать одну позицию в строке, если встречается
гласная - то две.
В итоге должно получится слово hello. Проблема в том, что значение в pos после первого
раза не меняется, как это поправить?



var str = "hieeelalaooo"; //строка
var vowels = "aeiouy"; //гласные
var pos=0, res;
var res = str.charAt(0);
for (var i = 0; i <= str.length; i++) {
  for (var j = 0; j <= vowels.length; j++) {
    if (pos == i) continue;//если есть позиция букву которой мы взяли то пропускаем 
    if (str[i] != vowels[j]) {//если согласная то 
      pos = i + 2;//позиция увеличивается на два
    } else {
      pos = i + 3;//если гласная то на три
    }
  }
  res += str[pos];//получаем букву
  console.log(res)
}



    


Ответы

Ответ 1



Наличие символа в массиве гласных можно делать с помощью indexOf, т.е. по факту вам не нужны 2 цикла с тремя счетчиками. var str = "hieeelalaooo"; //строка var vowels = "aeiouy"; //гласные var pos, res = ""; var i = 0; while (i < str.length) { res += str[i]; if(vowels.indexOf(str[i]) > -1) { i += 3; } else { i += 2; } } console.log(res);

Ответ 2



Ошибка в логике: вместо того, чтобы определить гласная буква или согласная, на каждую букву pos меняется столько раз, сколько букв в массиве vowels Кроме этого: проблемы со счетчиками (i <= str.length;, j <= vowels.length;) - в случае когда счетчик равен str.length, str[i] будет равен undefined, так как индексация идет с нуля. строка res меняется после изменения pos, но до проверок, что pos не выходит за границы строки. Поэтому в конце результата выводится много undefined if (pos == i) continue; - бесполезное условие, которое всегда false непонятно как связан счетчик i с переменной pos. Если убрать недочеты, то может получиться так: // Если встречается согласная буква, то пропускать одну позицию в строке, если встречается гласная - то две. var str = "hieeelalaooo"; //строка var vowels = "aeiouy"; //гласные var res = ''; for (var pos = 0; pos < str.length;) { res += str[pos]; var isVowels = false; for (var j = 0; j < vowels.length; j++) { // проверяем тип буквы if (str[pos] == vowels[j]) { // если гласная isVowels = true; // выставляем флаг break; // выходим } } if (isVowels) { pos += 3; } else { pos += 2; } console.log(res) } вместо внутреннего цикла, можно воспользоваться методом indexOf как в ответе @br3t либо перевести строку в объект, с ключами соответствующими гласным буквам и использовать его: // Если встречается согласная буква, то пропускать одну позицию в строке, если встречается гласная - то две. var str = "hieeelalaooo"; //строка var vowels = "aeiouy".split('').reduce((acc, el) => acc[el] = true && acc, {}); //гласные var res = ''; for (var pos = 0; pos < str.length;) { res += str[pos]; if (vowels[str[pos]]) { pos += 3; } else { pos += 2; } console.log(res) }

Ответ 3



var str = "hieeelalaooo"; //строка var vowels = "aeiouy"; //гласные var vowels = new Set(vowels.split('')); var res = ''; for (var i = 0; i < str.length; i++) { if (str[i] === ' ') res += str[i++]; res += str[i]; i = vowels.has(str[i]) ? i + 2 : i + 1; } console.log(res);

Ответ 4



var str = "hieeelalaooo"; var vowels = 'aeiouy'; var word = ''; for (var i = 0; i < str.length; i++) { if (str[i] == ' ') { word += ' '; } else if(vowels.indexOf(str[i]) > -1 ) { word += str[i]; i += 2; } else { word += str[i]; i++; } } console.log(word);

Ответ 5



=> что-то типа того, осмысленней и по-современней, чем предлагали выше: { const str = "hieeelalaooo"; //строка const glass = "aeiouy"; //гласные const res = []; str.split('').forEach(e=> glass.split('').includes(e) && !res.includes(e) ? res.push(e):'' ) console.log('гласные не повторяющиеся -> '+res.join('')); } ///////еще короче: { const str = "hieeelalaooo"; //строка const glass = "aeiouy"; //гласные str.split('').reduce( (sum,e) =>glass.split('').includes(e) && !sum.includes(e) && sum.push(e)&&sum||sum, [] ) }

Dictionary and custom pair [дубликат]

#c_sharp


        
             
                
                    
                        
                            This question already has answers here:
                            
                        
                    
                
                        
                            Составной ключ в Dictionary
                                
                                    (4 ответа)
                                
                        
                                Closed 2 года назад.
            
                    
public class Pair
{
    public FT x;
    public ST y;
    public Pair()
    { }
    public Pair(FT a, ST b)
    {
        x = a;
        y = b;
    }
}
Dictionary,int> used = new Dictionary, int>();


Есть код выше. Я добавляю в used данные таким образом   

used[new Pair(x, y)] = 1;


И когда хочу проверить used.ContainsKey(new Pair(x, y)), то всегда выдается
false, даже тогда, когда такие же x,y уже есть. Просто добавляются еще раз. С чем это
может быть связано?
    


Ответы

Ответ 1



Dictionary для того, чтобы обращаться к элементу по ключу, необходимо сравнивать ключи друг с другом. Вы должны реализовать операцию сравнения двух объектов класса Pair, например, реализовав интерфейс IEquatable>, либо, переопределив метод object.Equals и object.GetHashCode. Пример реализации IEquatable>: public class Pair : IEquatable> { private FT x; private ST y; public Pair() { } public Pair(FT a, ST b) { x = a; y = b; } public bool Equals(Pair other) { return EqualityComparer.Default.Equals(x, other.x) && EqualityComparer.Default.Equals(y, other.y); } public override bool Equals(object other) { if (other is Pair) return Equals((Pair)other); return false; } public override int GetHashCode() { return EqualityComparer.Default.GetHashCode(x) ^ EqualityComparer.Default.GetHashCode(y); } } Тонкий момент заключается в том, что эта операция сравнения не будет работать, если у типов FT и ST также нет реализации IEquatable или не переопределён метод object.Equals. UPDATE Как здесь ниже справедливо дописали в комментариях, при реализации IEquality Microsoft рекомендует также переопределить методы Equals и GetHashCode, а также операторы == и !=. Так что самый дешёвый способ, это переопределить методы Equals и GetHashCode. Добавил изменения в код.

Как перебрать все свойства объекта, преобразовать их неким образом и вернуть преобразованный объект?

#javascript


Как перебрать все свойства объекта, преобразовать их неким образом и вернуть преобразованный
объект?

есть объект такой

"object": {
    "user": "admin",
    "date": "14877890",
    "last": "SKIPPED"
}


Нужно преобразовать date в дату и получить новый объект
    


Ответы

Ответ 1



Вот пример с функцией map для прохождения по объекту, и преоброзования timestamp в date var object = { "user": "admin", "date": "14877890", "last": "SKIPPED" } function timestamp2date(timestamp) { var theDate = new Date(timestamp * 1000); return theDate.toGMTString(); } Object.keys(object).map(function(objectKey, index) { var value = object[objectKey]; if(objectKey == 'date'){ console.log(timestamp2date(value)); } });

Переключение между вкладками Chrome, зная tabId этих вкладок

#javascript #google_chrome #chrome_extension


Здравствуйте. 

Хочу реализовать переключение между вкладками Google Chrome в своём расширении. Расширение
уже узнаёт id вкладок и может их обновлять. 

Возможно ли сделать переключение между необходимыми мне вкладками, зная их tabId?


    


Ответы

Ответ 1



Для этого используйте updateProperties в методе .update(): chrome.tabs.update(tabId, { active: true });

Ломаю голову, контроль пути

#cpp #boost #геолокация


Имеется прорисовка пути маршрута автобуса выполненная при помощи массива точек (широта,
долгота) которые затем через leaflet прорисовываются у клиента

Делалось это все просто для визуального отображения маршрута в GPS мониторинге.
Теперь понадобилось контролировать съезд с маршрута как можно менее затратно в плане
ресурсов.

План таков, преобразовать каким то образом трансформировать точки в полигон и уже
через boost::geometry::intersects сверять находится ли машина на маршруте или нет при
поступлении свежих координат.

Идея по трансформации только такая, брать 2 точки добавлять по 10 метров отступа
слева и создавать полигон.

Проблема в том что точек на маршруте бывает под 1000..сомневаюсь что работать будет
быстро..может как то можно отсеять лишние точки

Ломаю голову..

Может есть что то готовое для подобной задачи?

Прошу помощи
    


Ответы

Ответ 1



А зачем возиться с полигонами? У вас есть массив точек маршрута. Каждая пара соседних точек определяет отрезок, часть маршрута. Определить, к какому отрезку ближе всего точка Вычислить кратчайшее расстояние до него (длинна перпендикуляра) Если оно больше максимального заданного расстояния Lmax - зафиксировать съезд с маршрута

Что делает vctip.exe?

#windows #visual_studio #visual_cpp


Чисто случайно обнаружил, что среди сообщений об ошибках Windows много ошибок vctip.exe.
Начал копать, выяснил, что это что-то в составе Visual C++ 2015, но что эта программа
делает - в Интернете не пишут (или я не нахожу). Подсунул вместо нее заглушку - ей
не передается никакая информация (ни в командной строке, ни через стандартный ввод).
Вызывается при компиляции, но самой компиляции не мешает.

Стало просто интересно. Кто-то может подсказать, что это и зачем?

PS

File   : vctip.exe
SHA256 :  46f89793d5df3ca4a24e1b1ee196ea150b105a7e10947c57e336509a12731c2f
SHA1   :  3648f03dc77946835fce7b54f358434a6f13bbc3
MD5    :  fd442c307bc454d3930eaf6ec878fd36
CRC32  :  cfa16112

    


Ответы

Ответ 1



Согласно данному ответу на форуме поддержки, это клиент телеметрии, который отправляет в Microsoft сведения о выполняемых в студии действиях и возникающих ошибках (Visual Studio Customer Experience Improvement Program). Ему ничего не передается через командную строку, потому что он берет всю информацию в режиме реального времени из Event Tracing for Windows. Visual Studio Customer Experience Improvement Program по умолчанию включена, но ее можно отключить способом, описанным здесь: В меню выбрать Справка -> Отправить отзыв -> Параметры. Выбрать параметр "Нет, я не хочу участвовать"