Сравнение строк Java
Для сравнения строк в Java используйте equals(), а не ==.
== сообщит вам, если две ссылки ссылаются на один и тот же объект. Чтобы проверить, идентичны ли две строки, .equals делает то, что вы хотите.
Следующая программа иллюстрирует это:
// Here's some text. String text1 = "Hello there"; // Here's the same text. String text2 = "Hello there"; // Here's a second reference to the // first string. String text3 = text1; // The first two strings are equal // (contain the same text) if(text1.equals(text2)) { System.out.println("text1 matches text2."); } // ... and in this case they are the same object, // which presumably is due to optimization by the // virtual machine. DO NOT rely on this!! if(text1 == text2) { System.out.println("text1 and text2 are the same object (oddly)"); } // text2 and text3 ARE clearly the same object, however. if(text2 == text3) { System.out.println("text2 and text3 are the same object."); }
Чтобы проверить, является ли объект строкой или нет, используйте instanceof.
// Here's a string. / Here's a string. String text1 = "Hello there"; if(text1 instanceof java.lang.String) { System.out.println("It's a string!"); }
Примеры
В качестве примера рассмотрим код для рекурсивного поиска файлов, расположенный на MSDN:
Эта функция получает список файлов указанной директории, а затем вызывает себя же для тех элементов списка, которые оказались директориями. Соответственно, при достаточно глубоком дереве файловой системы, мы получим закономерный результат.
Пример второго подхода, взятый из вопроса «Почему происходит переполнение стека?» с сайта под названием Stack Overflow (сайт является сборником вопросов и ответов на любые программистские темы, а не только по переполнению стека, как может показаться):
Как видно, в функции main выделяется память в стеке под массивы типов int и float по миллиону элементов каждый, что в сумме дает чуть менее 8 мегабайт. Если учесть, что по умолчанию Visual C++ резервирует под стек лишь 1 мегабайт, то ответ становится очевидным.
А вот пример, взятый из GitHub-репозитория проекта Flash-плеера Lightspark:
Можно надеятся, что h.getLength()-7 не будет слишком большим числом, чтобы на следующей строчке не произошло переполнения. Но стоит ли сэкономленное на выделении памяти время «потенциального» вылета программы?
Использование Регулярных Выражений
Теперь давайте использовать регулярное выражение -?\d+(\.\d+)? для сопоставления числовых Строк , состоящих из положительного или отрицательного целого числа и поплавков.
Само собой разумеется, что мы определенно можем изменить это регулярное выражение, чтобы идентифицировать и обрабатывать широкий спектр правил. Здесь все будет просто.
Давайте разберем это регулярное выражение и посмотрим, как оно работает:
- -? – эта часть определяет, является ли данное число отрицательным, тире ” – “ищет тире буквально и знак вопроса” ? ” отмечает свое присутствие как необязательное
- \d+ – при этом выполняется поиск одной или нескольких цифр
- (\.\d+)? – эта часть регулярного выражения предназначена для идентификации чисел с плавающей запятой. Здесь мы ищем одну или несколько цифр, за которыми следует точка. Знак вопроса, в конце концов, означает, что эта полная группа является необязательной.
Регулярные выражения-это очень широкая тема. Чтобы получить краткий обзор, ознакомьтесь с нашим учебником по API регулярных выражений Java .
А пока давайте создадим метод, используя приведенное выше регулярное выражение:
private Pattern pattern = Pattern.compile("-?\\d+(\\.\\d+)?"); public boolean isNumeric(String strNum) { if (strNum == null) { return false; } return pattern.matcher(strNum).matches(); }
Теперь давайте рассмотрим некоторые утверждения для приведенного выше метода:
assertThat(isNumeric("22")).isTrue(); assertThat(isNumeric("5.05")).isTrue(); assertThat(isNumeric("-200")).isTrue(); assertThat(isNumeric(null)).isFalse(); assertThat(isNumeric("abc")).isFalse();
Преобразование с использованием Integer.toString(int)
Класс Integer имеет статический метод, который возвращает объект String, представляющий параметр int, указанный в функции Integer.toString(int). Этот подход, в отличие от других, может возвращать исключение NullPointerException.
Синтаксис
Есть два разных выражения для метода Integer.toString():
public static String toString(int i) public static String toString(int i, int radix)
Параметры
Параметры этого метода:
- i: целое число, которое будет преобразовано.
- radix: используемая система счисления базы для представления строки.
Возвращаемое значение
Возвращаемое значение для обоих выражений – строка Java, представляющая целочисленный аргумент «i». Если используется параметр radix, возвращаемая строка определяется соответствующим основанием.
Пример
package MyPackage; public class Method1 { public static void main(String args[]) { int n = Integer.MAX_VALUE; String str1 = Integer.toString(n); System.out.println("The output string is: " + str1); int m = Integer.MIN_VALUE; String str2 = Integer.toString(m); System.out.println("The output string is: " + str2); } }
compareTo()
Метод compareTo() сравнивает строку с другой и возвращает int, сообщающий, меньше ли эта строка, равна или больше другой.
- Если строка в порядке сортировки раньше, чем другая, возвращается отрицательное число.
- совпадает с другой, возвращается 0.
- Если находится после другой в порядке сортировки, выводит положительное число.
Вот пример:
String one = "abc"; String two = "def"; String three = "abd"; System.out.println( one.compareTo(two) ); System.out.println( one.compareTo(three) );
В этом примере сравнивается одна строка с двумя другими. Вывод:
-3 -1
Числа отрицательны, потому что одна строка находится в порядке сортировки раньше, чем две другие.
Метод compareTo() фактически принадлежит интерфейсу Comparable.
Конвертация с помощью String.format()
String.format() – это новый альтернативный метод, который можно использовать для преобразования Integer в объект String. Хотя целью этого метода является форматирование строки, его также можно использовать для преобразования.
Синтаксис
Есть два разных выражения:
public static String format(Locale l, String format, Object… args) public static String format(String format, Object… args)
Параметры
Аргументы для этого метода:
- l: локальный адрес для форматирования;
- format: строка формата, которая включает спецификатор формата и иногда фиксированный текст;
- args: аргументы, которые ссылаются на спецификаторы формата, установленные в параметре format.
Возвращаемое значение
Этот метод возвращает отформатированную строку в соответствии со спецификатором формата и указанными аргументами.
Пример
class Method3 { public static void main(String args[]) { int number = -1234; String str = String.format("%d", number); System.out.println("With format method: string = " + str); } }
Как научиться решать проблемы
Чтобы решать проблемы с большей удовлетворенностью от результата, нужно выйти за пределы когнитивного аспекта. Доктор Роберт Хоган предлагает учитывать наши реакции на плохие решения, собирать обратную связь, быть открытым для дальнейшего развития и восприимчивым к коучингу (coachability).
Объединяя исследования способностей, личности, творческого решения проблем и организационной эффективности, мы можем «собрать» единый процесс решения сложных проблем.
Процесс решения сложных проблем
Решение сложных проблем — это работа с неопределенностью без единственно правильного ответа. Чтобы развить навык, необходимо практиковаться, разделять этапы решения проблем и задавать правильные вопросы.
Четкое разделение этапов решения проблемы поможет сфокусироваться на главном, сэкономить энергию и ресурсы и управлять решением проблемы как проектом.
При этом на каждом этапе нужно задавать правильные вопросы. Своевременные вопросы повысят точность собственных суждений, помогут развить свое и мышление сотрудников. Вот вопросы для каждого этапа:
Сложная ситуация
- Что именно я знаю о ситуации наверняка?
- Какие я могу сделать предположения?
- Какими данными я могу пренебречь?
Решение правильной проблемы
- Это точно проблема? Где мы проведем границу между особенностями ситуации (человека, продукта или организации) и тем, что мы будем считать проблемой?
- Какому приоритету она противоречит?
- На кого, на что, и как влияет эта проблема?
Правильное решение проблемы
- Достаточно ли альтернатив мы рассмотрели?
- Что будет минимально необходимым решением, что неприемлемым, а что — сверх-задачей?
- Что для нас будет образом хорошего результата?
Реакция на неправильное решение
- Не воспринимаю ли я обратную связь на свое решение «в штыки»? Как я отреагировал на нее?
- Каким был мой вклад в неправильное решение?
- Какую часть обратной связи я считаю полезной для будущих действий?
Если мы хотим максимально реализовать свои способности, использовать склонности и совершенствовать навыки, в общую рамку РППР необходимо включить способность и анализировать, и синтезировать, и генерировать, и выбирать, и работать с обратной связью. Ошибки в решениях невозможно устранить полностью, но с каждой следующей проблемой можно совершенствовать свое мастерство и добиваться лучших результатов.
Сравнение строк: equals() или ==?
Рассмотрим пример.
Хотя в двух переменных содержится одно и то же слово, мы имеем дело с двумя разными объектами и оператор == вернёт false.
Однажды, когда деревья были большими, мне понадобилось сравнить две строки из разных источников. Хотя строки выглядели совершенно одинаково, сравнение при помощи оператора == возвращало false и путало мне все карты. И только потом я узнал, что нужно использовать метод equals(). Строка в Java — это отдельный объект, который может не совпадать с другим объектом, хотя на экране результат выводимой строки может выглядеть одинаково. Просто Java в случае с логическим оператором == (а также !=) сравнивает ссылки на объекты (при работе с примитивами такой проблемы нет):
Присоединение, объединение или добавление строк в Java
Самый простой способ объединить строки в Java – это использовать +. Это работает так:
String text1 = "Hello"; String text2 = "Jim"; System.out.println(text1 + " " + text2);
Однако это не очень эффективно, потому что каждый раз, когда вы пишете +, вы создаете новый объект String. По этой причине вы можете использовать StringBuilder или более старую поточно-ориентированную версию StringBuffer.
StringBuilder sb = new StringBuilder(); sb.append("Hello"); sb.append(" to"); sb.append(" you"); System.out.println(sb.toString());
Более того, поскольку append() возвращает ссылку на сам объект StringBuilder, мы можем написать что-то вроде этого с тем же эффектом:
StringBuilder sb = new StringBuilder(); sb.append("Hello") .append(" to") .append(" you"); System.out.println(sb.toString());
Подстрока Java: выбор частей строк
Чтобы получить часть строки, используйте метод substring.
String substring(int beginIndex, int endIndex)
Длина выбранной подстроки равна endIndex – startIndex.
Вот несколько примеров.
String text = "The quick brown fox"; // Everything from index 4 onwards System.out.println(text.substring(4)); // Index 0 up to but not including index 3. System.out.println(text.substring(0, 3));
Java Array String: объединение массивов строк
Удивительно, но в ядре Java нет способа объединения массивов строк, хотя такие методы существуют в различных библиотеках.
Вы всегда можете создать свои собственные. Следующий класс объявляет именно такой метод и использует его для соединения массива строк. Вы можете легко адаптировать это для работы с ArrayList или Vector или чем-то еще.
package caveofprogramming.aquarium; package caveofprogramming.aquarium; import java.util.*; public class Test { public static String join(String[] strings, String glue) { StringBuilder sb = new StringBuilder(); for(int i=0; i < strings.length; i++) { sb.append(strings); if(i < strings.length - 1) { sb.append(glue); } } return sb.toString(); } public static void main(String [] args) { String texts[] = {"Hello", "to", "you"}; System.out.println(join(texts, " ")); } }
Java String Split: разделение строк
Вы можете разбить строку на массив токенов, используя метод split (REGEX).
Давайте посмотрим на некоторые примеры.
Чтобы разделить пробелом (это также работает для вкладок):
String text = "The quick brown fox"; String text = "The quick brown fox"; // Split on whitespace String [] tokens = text.split("\s+"); for(int i=0; i < tokens.length; i++) { System.out.println(tokens); }
Разделим электронный адрес на части
String text = "[email protected]"; // Split on @ and . // The double backslashes make this regular // expression look more confusing than it is. // We are escaping once for the sake of the // regex, and again for the sake of Java. String [] tokens = text.split("+"); for(int i=0; i < tokens.length; i++) { System.out.println(tokens); }
Разделение
Класс Java String содержит метод split(), который можно использовать для разделения String на массив объектов String:
String source = "A man drove with a car."; String[] occurrences = source.split("a");
После выполнения этого кода Java массив вхождений будет содержать экземпляры String:
"A m" "n drove with " " c" "r."
Исходная строка была разделена на символы a. Возвращенные строки не содержат символов a. Символы a считаются разделителями для деления строки, а разделители не возвращаются в результирующий массив строк.
Параметр, передаваемый методу split(), на самом деле является регулярным выражением Java, которые могут быть довольно сложными. Приведенное выше соответствует всем символам, даже буквам нижнего регистра.
Метод String split() существует в версии, которая принимает ограничение в качестве второго параметра – limit:
String source = "A man drove with a car."; int limit = 2; String[] occurrences = source.split("a", limit);
Параметр limit устанавливает максимальное количество элементов, которое может быть в возвращаемом массиве. Если в строке больше совпадений с регулярным выражением, чем заданный лимит, то массив будет содержать совпадения с лимитом – 1, а последним элементом будет остаток строки из последнего среза – 1 совпадением. Итак, в приведенном выше примере возвращаемый массив будет содержать эти две строки:
"A m" "n drove with a car."
Первая строка соответствует регулярному выражению. Вторая – это остальная часть строки после первого куска.
Выполнение примера с ограничением 3 вместо 2 приведет к тому, что эти строки будут возвращены в результирующий массив String:
"A m" "n drove with " " car."
Обратите внимание, что последняя строка по-прежнему содержит символ в середине. Это потому, что эта строка представляет остаток строки после последнего совпадения (a после ‘n водил с’)
Выполнение приведенного выше примера с пределом 4 или выше приведет к тому, что будут возвращены только строки Split, поскольку в String есть только 4 совпадения с регулярным выражением a.
Работайте вне стола
Способ для тех, кому становится совсем невмоготу работать в опенспейсе. Здорово, если ваша компания даёт возможность иногда работать из дома, но если это не ваш вариант, выход всё равно есть. Попробуйте ненадолго выйти в тихое кафе или на часок забронируйте свободную переговорку (главное не злоупотреблять этим приёмом, чтобы уже вашим коллегам не пришлось проводить совещание посреди офиса). Если вы работаете за стационарным компьютером, а не за ноутбуком, попробовать стать немного мобильнее всё равно стоит — можно, например, распечатать какую-то информацию, которую нужно изучить (хотя, конечно, это не самый экологичный вариант), или поработать с телефона — прочитать гугл-док или ответить на письма можно и с него.
Фотографии: artbox_of_life — stock.adobe.com, bando, etsy — stock.adobe.com
Стек программы
Стек программы — это специальная области памяти, организованная по принципу очереди LIFO (Last in, first out — последним пришел, первым ушел). Название «стек» произошло из-за аналогии принципа его построения со стопкой (англ. stack) тарелок — можно класть тарелки друг на друга (метод добавления в стек, «заталкивание», «push»), а затем забирать их, начиная с верхней (метод получения значения из стека, «выталкивание», «pop»). Стек программы также называют стек вызовов, стек выполнения, машинным стеком (чтобы не путать его со «стеком» — абстрактной структурой данных).
Для чего нужен стек? Он позволяет удобно организовать вызов подпрограмм. При вызове функция получает некоторые аргументы; также она должна где-то хранить свои локальные переменные. Кроме того, надо учесть, что одна функция может вызвать другую функцию, которой тоже надо передавать параметры и хранить свои переменные. Используя стек, при передаче параметров нужно просто положить их в стек, тогда вызываемая функция сможет их оттуда «вытолкнуть» и использовать. Локальные переменные тоже можно хранить там же — в начале своего кода функция выделяет часть памяти стека, при возврате управления — очищает и освобождает. Программисты на высокоуровневых языках обычно не задумываются о таких вещах — весь необходимый рутинный код за них генерирует компилятор.
Как комплексный подход помогает решать проблемы
Мы живем в VUCA-мире — мире ускоряющихся изменений, в котором компании и целые отрасли трансформируются быстрее, чем раньше. Например, CEO General Motors Мэри Барра считает, что автомобильная индустрия изменится сильнее в последующие пять-десять лет, чем за предыдущие 50 лет. Такой мир становится стрессовым фоном для всех людей и выводит на первый план личностные особенности, которые либо помогают, либо мешают решать сложные проблемы.
Психотерапевт Андрей Курпатов о том, как помочь мозгу обучаться и принимать решения
По личностной характеристике человека можно предсказать, как он будет решать проблемы и принимать решения. Например, экстраверсия отрицательно связана с качеством решений, но положительно влияет на их внедрение в практику. Высокая импульсивность связана с ошибочными решениями, склонностью к рискованному и необдуманному поведению, хотя часто прикрывается ширмой «надо уметь думать на ходу».
Специалист управляет самим собой и задачами, которыми занимается. Чем выше он поднимается по организационной иерархии, тем более комплексные задачи встречает и тем важнее развитые навыки решения сложных проблем. Лидерские и стратегические компетенции становятся важнее предметных. Теперь он управляет «портфелями» проектов, решает трансформационные задачи и повышает стоимость бизнеса в целом. Для этого нужны долгосрочное видение, умение вести переговоры и решать сложные проблемы.
Именно поэтому при исследовании РППР нам требуется комплексный подход, который не ограничен лишь когнитивным аспектом — что человек способен делать, а включает в себя оценку личностных характеристик — к чему человек склонен и поведенческий аспект — что человек умеет делать на практике.
Почему существует такой разрыв
Именно такая разница в доходах и опровергает банальную истину о том, что высокий доход связан с большим количеством работы. То есть если какой-нибудь миллиардер зарабатывает 40 тысяч рублей в секунду, что в России составляет примерный средний размер месячной зарплаты, то это не значит, что он работает в 2,6 млн раз больше обычного гражданина (в одном месяце примерно 2,6 млн секунд).
На уровень дохода в первую очередь влияют другие факторы, такие как квалификация, интеллект, опыт, общественные связи и даже образование. Несмотря на противоречивость последнего фактора, стоит признать, что в процентном соотношении количество образованных людей среди миллионеров намного выше, чем среди общего населения.
Тем не менее, несмотря на огромную разницу между доходами самых богатых людей и самых бедных, стоит признать, что люди с высоким заработком работают значительно больше и тяжелее остальных. Ранее мы уже описывали связь между уровнем дохода и трудолюбием. По словам финансового консультанта Тома Корли, люди с хорошим заработком тратят на работу значительно больше времени, меньше отдыхают и, что примечательно, меньше смотрят телевизор. Таким образом, Корли указывает на особенность богатых людей проводить свой досуг с пользой.
Эксперт отмечает также связь между любовью к своей работе и показателем успеха: «86% богатых людей, с которыми мне приходится иметь дело, признаются, что получают удовольствие от своей профессии». При этом Корли добавляет, что в среднем эти люди работают по 50–60 часов в неделю, что ощутимо больше общего количества рабочих часов обычного человека.
Правда, остается неясной ситуация с той категорией работников, которые получают такое же удовольствие от своей профессии, но зарабатывают значительно меньше. И тут мы подошли к одной из главных тем обсуждения. Помимо любви к своей работе, важным значением остается ее уникальность и востребованность. Например, можно работать барменом и получать от этого огромное удовольствие, но кто будет спорить, что профессия нейрохирурга намного тяжелее, требует гораздо большей квалификации, а соответственно, и оплачивается заслуженно выше.
Это же касается и множества других профессий. Грубо говоря, пока рынок труда будет поставлять менеджеров намного чаще, чем тех же программистов, последние будут иметь и значительно больший доход. Есть, конечно, и социально значимые профессии, которые обладают большой востребованностью и требуют высокой квалификации: учителя, врачи, спасатели и прочие. Но уровень дохода этой категории лиц зависит в том числе и от экономического положения каждой конкретной страны. Если в США, например, врачи считаются представителями зажиточного среднего класса, то в России таковыми могут являться разве что хорошие специалисты, занимающиеся частной практикой.
Говоря о богатстве в широком смысле, надо учитывать и то, что большой доход связан с общим форматом работы. Наемному специалисту, работающему по фиксированному графику, всегда будет труднее заработать больше того, кто работает сам на себя. В итоге в наибольшем финансовом выигрыше остается тот, кто берет на себя конечную ответственность за общий труд. То есть большие временные затраты предприниматель компенсирует готовностью брать на себя определенные риски.
Обновлённый оператор switch в Java 14
С версии 14 Java поддерживает новый синтаксис switch:
Теперь нам не нужно писать break, а двоеточие заменено на стрелочку и фигурные скобки. Блок default по-прежнему не обязателен.
Если код блока case состоит всего из одной строки, то фигурные скобки можно не использовать:
В операторе switch прошлой версии мы задавали одно действие для нескольких значений case, располагая пустые case над case c кодом:
В новой версии для этого хватает одного case, а связанные с ним значения разделяются запятой. Например:
Теперь switch — уже не просто оператор ветвления, он может вернуть значение. Это делается с помощью вспомогательного оператора yield.
Пример:
В новой версии switch, когда нам нужно лишь вернуть значение из соответствующего case (он должен быть без кода), — можно обойтись и без слова yield:
Советы и упрощения
1. Фигурные скобки после if или else разрешено не ставить, если тело блока состоит всего из одной строки.
Однако всё же советую ставить скобки, так вы научитесь быть последовательными и облегчите рефакторинг кода.
2
Вот так писать не следует (внимание на условие в if):. Код будет работать, но сравнение boolean с boolean в условии — это лишняя операция
Код будет работать, но сравнение boolean с boolean в условии — это лишняя операция.
Поскольку метод isMoreFive сам возвращает булево значение — напишите вот так:
Здесь снова ненужное сравнение:
Чтобы не было лишней операции — пишите вот так:
Объединение строк
Для соединения строк можно использовать
операцию сложения («+»):
String str1 = "Java"; String str2 = "Hello"; String str3 = str1 + " " + str2; System.out.println(str3); // Hello Java
При этом если в операции сложения строк
используется не строковый объект, например, число, то этот объект преобразуется
к строке:
String str4 = "Год " + 2015;
Еще один метод объединения — метод join() позволяет
объединить строки с учетом разделителя. Например, две строки
String str1 = "Java"; String str2 = "Hello";
будут сливаться в одно слово «HelloJava», если их
объединить с помощью оператора +:
String str3 = str1 + str2;
но если мы хотим, чтобы две подстроки при
соединении были разделены пробелом, то можно воспользоваться методом join() следующим
образом:
String str3 = String.join(" ", str2, str1); // Hello Java
В общем случае вместо пробела здесь
можно ставить любой разделитель в виде строки.
Обратите внимание, что каждый раз при
объединении строк мы получали новую строку как результат объединения
АЛЬТЕРНАТИВА ОТСТРАНЕНИЮ ОТ РАБОТЫ
К счастью, она есть. Правда, ведомства и здесь не пришли к единому мнению. В своих Рекомендациях Минтруд России и Роспотребнадзор отмечают, что вместо отстранения работника можно перевести на дистанционную работу:
Извлечение из Рекомендаций
7. В случае, если трудовая функция может быть выполнена дистанционно, работодатель вправе предложить работнику выполнение работы дистанционно либо по собственной инициативе работника временно перевести его на дистанционную работу в порядке и по основаниям, предусмотренным статьей 312.9 Трудового кодекса Российской Федерации. Таким правом преимущественно необходимо воспользоваться в отношении работников, имеющих противопоказания к проведению профилактической прививки.
В свою очередь, Роструд не считает перевод на дистанционную работу альтернативой отстранению, зато не против, если вместо отстранения работнику будет предоставлен ежегодный оплачиваемый отпуск. Более того, работодатель не вправе отказывать работнику в предоставлении ежегодного оплачиваемого отпуска, предусмотренного графиком отпусков, по причине того, что работник не сделал прививку от коронавирусной инфекции.
Если в период отстранения у работника появляется право уйти в отпуск по беременности и родам или по уходу за ребенком, такой отпуск должен быть ему предоставлен.
С момента предоставления отпуска период отстранения прерывается.
Извлечение из ответа на вопрос на портале Онлайнинспекция.рф
Один из сотрудников категорически отказывается делать прививку, с 15.07.2021 мы обязаны отстранить работника от работы, но с 02.08.2021 согласно графику отпусков она написала заявление на предоставление ей ежегодного оплачиваемого отпуска. Можем ли мы во время отстранения от работы предоставлять ежегодный оплачиваемый отпуск или мы должны ее отстранить до отпуска, а после отпуска отстранить заново?
Ответ:
Отстранение от работы не препятствует реализации права отстраненного работника на очередной отпуск. Во время отпуска работник свободен от исполнения трудовых обязанностей, поэтому после ухода в отпуск его отстранение от работы не производится. Если период повышенной готовности в субъекте РФ не будет прекращен, по окончании отпуска работник не может быть допущен к работе.
К сожалению, на большинство животрепещущих вопросов специалисты портала Онлайнинспекция.рф отвечают однотипными цитатами из НПА и писем ведомств, не разбирая конкретные ситуации и не отвечая четко на вопросы пользователей.
Что такое принятие решений и решение проблем
Каждый день мы принимаем сотни решений, которые влияют на нашу жизнь: по разным оценкам только относительно еды их количество доходит до 225 в день. Решения часто оказываются неудачными, нам приходится работать с их последствиями и принимать новые решения. По данным Росстата за 2019 год, в России на 1 000 браков пришлось 653 развода, а за последние 15 лет индустрия сведения татуировок выросла на 440%.
Неэффективные, неуместные, необоснованные решения в бизнесе и управлении встречаются не реже, чем в бытовых ситуациях. Пять лет назад Мировой Экономический Форум в Давосе сделал прогноз, какие компетенции будут определять профессионала будущего в 2020 году. Сейчас это будущее уже наступило. Компетенции, связанные с принятием решений, остаются в ТОП-10 самых важных навыков, а решение сложных проблем занимает лидирующую позицию.
Прогноз 2016 года о самых востребованных навыках будущего — в 2020 году
(Фото: World Economic Forum)
Решение проблем и принятие решений часто смешивают или используют как синонимы. Корректно их разделять, при этом рассматривать в одном «семействе» компетенций РППР (PSDM) — Решение Проблем и Принятие Решений (Problem Solving & Decision Making).
К PSDM обычно относят:
- Системное мышление.
- Стратегическое мышление.
- Критический анализ информации.
- Осознанность в принятии решений.
- Взаимодействие со стейкхолдерами.
- Креативный подход к решению проблем.
- Лидерство в условиях неопределенности.
- Стимулирование организационных изменений.
Большинство компаний, которые я консультирую, добавляют хотя бы два-три навыка из этого списка в модели корпоративных компетенций или эталонные профили должности. При этом чем выше управленческая позиция, тем серьезнее требования бизнеса и меняющегося ландшафта к уровню этих компетенций. Здесь есть две новости: хорошая и не очень.
Хорошая новость в том, что научные сообщества давно изучают PSDM с разных сторон. Например, Ариэль Рубинштейн развил концепцию Герберта Саймона о нашей ограниченной рациональности и рассмотрел наши решения в русле институциональной экономики и теории игр. Психологи-когнитивисты Дэниел Канеман, лауреат Нобелевской премии по экономике в 2002 году и Амос Тверски описали, как мы ищем «короткие» пути в решении сложных задач, но попадаем в ловушки и предубеждения. А социолог Барри Шварц в книге «Парадокс выбора» объяснил, почему большой выбор затрудняет принятие решений и приводит к ощущению неудовлетворенности.
Новость, которая не очень. Ни исследовательское, ни бизнес-сообщество до сих пор не решили, что именно считать решением: взгляды на природу решений разные, а единого определения — нет.