Архив автора: admin

Разница между VARCHAR и TEXT в MySQL

MySQL имеет много типов данных для хранения строковых данных в таблице. VARCHAR и TEXT — два из них. Оба могут хранить максимум 65535 символов, но между этими типами данных, описанными в этом руководстве, есть некоторые различия.

 

VARCHAR против TEXT:

Существует много различий между типами данных VARCHAR и TEXT. Различия между этими типами данных описаны ниже.

 

Особенности VARCHAR и TEXT

Типы данных VARCHAR и TEXT по-разному хранят данные в таблице базы данных. Различные особенности этих типов данных описаны ниже.










VARCHARTEXT
В основном используется для хранения небольших строковых данных.В основном используется для хранения больших строковых данных.
Используется для хранения строковых данных переменной длины.Используется для хранения строковых данных фиксированной длины.
Максимальная длина строки может быть определена.Длина строки не может быть определена.
Индекс нельзя применять к этому типу данных.Индекс можно применять в этом типе данных.
Требуется длина + 1 байт пробела, если значение длины меньше или равно 255 символам, и длина + 2 байта пробела, если длина больше или равна 256 символам.Занимает длину +2 байта дискового пространства.
Работает медленнее.Работает быстрее.

 

Декларация VARCHAR и TEXT

Способы объявления типов данных VARCHAR и TEXT объясняются ниже путем создания двух таблиц с полем типов данных VARCHAR и TEXT. Длина требуется для определения типа данных VARCHAR, а длина не требуется для определения типа данных TEXT.

Выполните следующую инструкцию CREATE DATABASE, чтобы создать базу данных с именем test_db.

CREATE DATABASE test_db;

 

Запустите следующую инструкцию запроса, чтобы выбрать базу данных test_db перед созданием таблицы.

USE test_db;

 

Выполните следующую инструкцию CREATE TABLE, чтобы создать таблицу клиентов, содержащую пять полей. Здесь тип данных поля id — целое число, а тип данных полей name, email, address и contact_no — varchar, содержащий значение длины.

CREATETABLE customers(

id INTNOT NULL PRIMARY KEY,

name VARCHAR(30) NOT NULL,

email VARCHAR(50),

address VARCHAR(300),

contact_no VARCHAR(15));

 

Выполните следующую инструкцию DESCRIBE, чтобы проверить структуру таблицы клиентов.

DESCRIBE customers;

 

Выполните следующий запрос INSERT, чтобы вставить три записи в таблицу клиентов.

INSERT INTO `customers` (`id`, `name`, `email`, `address`, `contact_no`) VALUES ('01', 'Andrey Ex', 'Andrey@gmail.com', '25, aaaaaaaaaaaaaa, Bangladesh ', '0191275634'),

       ('02', 'Sasha Destroyer', 'Sasha@gmail.com', 'bbbbbbbbbbbbbbbbbb', '01855342357'),

       ('03', 'Masha Bubba', 'Masha@hotmail.com', 'cccccccccccccc', NULL);

 

Запустите следующую инструкцию SELECT, чтобы прочитать все записи таблицы клиентов.

SELECT * FROM customers;

 

Запустите следующую инструкцию CREATE TABLE, чтобы создать таблицу сотрудников, содержащую пять полей. Тип данных поля id — целое число. Тип данных полей name, email и contact_no — varchar. Тип данных адресного поля — текст. Здесь для поля адреса не объявлено значение длины из-за текстового типа данных.

CREATETABLE employees(

id INTNOT NULL PRIMARY KEY,

name VARCHAR(30) NOT NULL,

email VARCHAR(50),

address TEXT,

contact_no VARCHAR(15));

 

Выполните следующую инструкцию DESCRIBE, чтобы проверить структуру таблицы сотрудников.

DESCRIBE employees;

 

Выполните следующий запрос INSERT, чтобы вставить три записи с одинаковым содержимым таблицы клиентов в таблицу сотрудников.

INSERT INTO `employees` (`id`, `name`, `email`, `address`, `contact_no`) VALUES ('01', 'Andrey Ex', 'Andrey@gmail.com', 'aaaaaaaaaaaaaaaaaaaaaaa', '0191275634'),

       ('02', 'Sasha Destroyer', 'Sasha@gmail.com', 'bbbbbbbbbbbbbbbbbbbbbb', '01855342357'),

       ('03', 'Masha Bubba', 'Masha@hotmail.com', 'ccccccccccccccccccc', NULL);

 

Выполните следующую инструкцию SELECT, чтобы прочитать все записи таблицы сотрудников.

SELECT * FROM employees;

 

Производительность VARCHAR и TEXT

Ранее уже упоминалось, что тип данных TEXT работает быстрее, чем тип данных VARCHAR. Вы должны выбрать базу данных, содержащую таблицы с полем типа данных VARCHAR и TEXT, и включить профилирование текущего сеанса MySQL, чтобы проверить, какой тип данных быстрее между VARCHAR и TEXT.

База данных была выбрана здесь во время создания таблицы. Таким образом, нам не нужно выбирать его снова. Выполните следующую инструкцию SET, чтобы включить профилирование SESSION.

SET SESSION profiling = 1;

 

Выполните следующий запрос SELECT, чтобы прочитать все записи таблицы клиентов.

SELECT * FROM customers;

 

Выполните следующий запрос SELECT, чтобы прочитать все записи таблицы сотрудников.

SELECT * FROM employees;

 

Выполните следующую команду, чтобы проверить производительность двух предыдущих запросов SELECT.

SHOW PROFILES;

 

Следующий вывод появится после выполнения команды SHOW PROFILES. Согласно выходным данным, запрос SELECT для таблицы клиентов содержит поле адреса типа данных VARCHAR, требуемое 0,00101000 секунд, а запрос SELECT для таблицы сотрудников, содержащей поле адреса типа данных TEXT, требует 0,00078125 секунд. Это доказывает, что тип данных TEXT работает быстрее, чем тип данных VARCHAR для тех же данных.

Вы можете сравнить выходные данные следующих двух запросов, чтобы подробно проверить производительность типов данных VARCHAR и TEXT.

SELECT * FROM INFORMATION_SCHEMA.PROFILING WHERE QUERY_ID=1;



SELECT * FROM INFORMATION_SCHEMA.PROFILING WHERE QUERY_ID=2;

 

Вывод:

Оба типа данных VARCHAR и TEXT важны для создания таблиц в базе данных MySQL. Различия между этими типами данных были должным образом объяснены в этом руководстве с примерами, чтобы помочь пользователям MySQL выбрать правильный тип данных поля таблицы во время создания таблицы.



2022-02-15T14:56:35
MariaDB

Как читать из локального файла в Java

Локальный файл находится на жестком диске или флешке, подключенной к порту USB. Файлы можно разделить на две категории: текстовые файлы и байтовые файлы. Типичные текстовые файлы — это файлы, созданные текстовым редактором. Файл изображения является примером байтового файла, состоящего в основном из необработанных байтов.

В этой статье дается базовое объяснение того, как читать локальные текстовые и байтовые файлы в Java. Чтобы прочитать текстовый файл, используйте класс FileReader. Чтобы прочитать байтовый файл, используйте класс FileInputStream. Оба класса находятся в пакете java.io.*, который необходимо импортировать. Первая половина этой статьи посвящена чтению текстовых файлов, а вторая половина — чтению байтовых файлов.

 

Чтение текстовых файлов

Создание объекта FileReader

Прежде чем научиться создавать объект FileReader, создайте следующий текстовый файл с помощью текстового редактора и нажмите клавишу Enter в конце первых двух строк:

A text 1 A text 1 A text 1 A text 1 A text 1



B text 2 B text 2 B text 2 B text 2 B text 2



C text 3 C text 3 C text 3 C text 3 C text 3

 

Если клавиша Enter не нажата в конце последней строки, текстовый редактор может добавить новую строку при сохранении файла. После создания предыдущего текста сохраните содержимое с именем temp.txt, используя меню текстового редактора, user@host :~/dir1$, в каталог. Это означает, что должен быть создан каталог dir1.

 

Создание программы чтения файлов

Класс FileReader имеет пять конструкторов. В этой статье проиллюстрирован только один (чтобы статья была короткой). Синтаксис конструктора следующий:

public FileReader(String fileName) throws FileNotFoundException

 

При этом создается в памяти поток (копия) файла, путь и имя которого представляет собой строку fileName. Выдает исключение FileNotFoundException, если файл не найден в указанном каталоге. После копирования содержимого файла открытый файловый объект необходимо закрыть, чтобы освободить любые системные ресурсы, связанные с открытым файлом.

 

Важные методы FileReader

Если конструктор успешно создан, то файл считается открытым. После использования файл должен быть закрыт. Синтаксис для закрытия файла:

public void close() throws IOException

 

После того, как файл только что был открыт, эффективное чтение файла еще не произошло. Чтобы читать по одному символу за раз (один, затем следующий), используйте синтаксис метода FileReader:

public int read() throws IOException

 

Это возвращает прочитанный символ (в виде целого числа) или -1, если достигнут конец потока (потока копирования файла в памяти).

Чтобы прочитать следующую последовательность символов файла в массив, используйте синтаксис метода FileReader:

public int read(char[] cbuf, int off, int len) throws IOException

 

Он возвращает количество прочитанных символов или -1, если был достигнут конец потока. Off в синтаксисе означает смещение. Это индекс в файле, с которого должно начаться чтение следующей последовательности символов. Len — количество символов для чтения. Это должна быть длина массива, а cbuf — это массив, в который считывается последовательность символов.

Помните, что объект FileReader должен быть закрыт с помощью его метода close после эффективного чтения.

Синтаксис метода, чтобы узнать, не вернет ли следующее чтение -1, таков:

public boolean ready() throws IOException

 

Он возвращает true, если есть что-то для чтения, и false в противном случае.

 

Чтение в строку

Следующий код считывает предыдущий файл посимвольно в строку StringBuilder:

            StringBuilder sb = new StringBuilder();

try{

FileReaderfr = new FileReader("dir1/temp.txt");



                while (fr.ready()) {          

                    char ch = (char)fr.read();

sb.append(ch);

                }

            }

catch(Exception e) {

e.getMessage();

            }

System.out.println(sb);

 

Код начинается с создания экземпляра объекта StringBuilder, sb. Далее идет конструкция try-catch. Блок try начинается с создания экземпляра FileReader, фр. И есть цикл while, который повторяется до тех пор, пока ready() не вернет false. Первый оператор цикла while считывает и возвращает следующий символ в виде целого числа. Его нужно перевести в char. Следующий оператор в цикле while добавляет к строке следующий символ, sb. Результат:

A text 1 A text 1 A text 1 A text 1 A text 1



B text 2 B text 2 B text 2 B text 2 B text 2



C text 3 C text 3 C text 3 C text 3 C text 3

 

Это в точности содержимое файла, но добавлена ​​лишняя строка на компьютере автора.

 

Чтение в массив

При чтении в массив содержимое массива должно быть освобождено для чтения следующей последовательности символов. Следующий код иллюстрирует это:

            StringBuilder sb = new StringBuilder();

try{

FileReaderfr = new FileReader("dir1/temp.txt");



                while (fr.ready()) {    

char[] arr = new char[5];

                    int offset = 0;

fr.read(arr, offset, 5);

                    offset = offset + 5;

System.out.print(arr);

                }

            }

catch(Exception e) {

e.getMessage();

            }

System.out.println();

 

Значение смещения должно увеличиваться для каждой итерации на длину массива. Результат:

A text 1 A text 1 A text 1 A text 1 A text 1



B text 2 B text 2 B text 2 B text 2 B text 2



C text 3 C text 3 C text 3 C text 3 C text 3

 

Это точно так же, как содержимое файла, но с добавлением дополнительной строки на компьютере автора.

 

Чтение байтовых файлов

Создание объекта FileInputStream

Следующий файл изображения называется bars.png. Он находится в каталоге user@host :~/dir1$, который совпадает с каталогом temp.txt. Он состоит всего из трех цветных полос:

Создание объекта FileInputStream

 

Создание FileInputStream

Конструктор для объекта FileInputStream:

public FileInputStream(String name) throws FileNotFoundException

 

Поскольку он выдает исключение, он должен быть в конструкции try-catch. Помните, что этот класс предназначен для чтения байтов.

 

Важные методы FileInputStream

Если конструктор успешно создан, то файл считается открытым. После чтения байтов файл необходимо закрыть, используя следующий синтаксис:

public void close() throws IOException

 

После того, как файл только что был открыт, эффективное чтение файла еще не произошло. Чтобы читать по одному байту за раз (один, затем другой), используйте синтаксис метода FileInputStream:

public int read() throws IOException

 

Это возвращает прочитанный байт (как целое число) или -1, если достигнут конец потока (потока копирования файла в памяти).

Помните, что после этого эффективного чтения объект FileInputStream должен быть закрыт с помощью его метода close.

Чтобы получить оценку количества байтов, оставшихся для чтения, используйте синтаксис метода:

public int available() throws IOException

 

Поскольку этот метод возвращает оценку, при использовании в сочетании с read() нельзя быть уверенным, что все байты файла были прочитаны. И следует отдать предпочтение следующему методу, который считывает все байты:

public byte[] readAllBytes() throws IOException

 

Этот метод возвращает все оставшиеся байты, но все равно будет читать весь файл.

 

Чтение в ArrayList

ArrayList должен быть импортирован из пакета java.util.*. Следующий код считывает оценку всех байтов в объект ArrayList:

ArrayList al = new ArrayList();

try{

FileInputStream fir = new FileInputStream("dir1/bars.png");



                while (fir.available() > 0) {          

                    byte bt = (byte)fir.read();

al.add(bt);

                }

            }

catch(Exception e) {

e.getMessage();

            }

System.out.println(al);

 

Код начинается с создания экземпляра объекта ArrayList, например. Далее идет конструкция try-catch. Блок try начинается с создания экземпляра FileInputStream, fir. И есть цикл while, который повторяется, пока не будет доступен(), и предполагает, что не осталось ни одного байта для чтения. Первый оператор цикла while считывает и возвращает следующий байт в виде целого числа. Его нужно преобразовать в байт. Следующий оператор в цикле while добавляет (добавляет) следующий символ в список, т.е. Результат:

[-119, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 0, -7, 0, 0, 0, -10, 8, 6, 0, 0, 0, 20, 25, 33, 69, 0, 0, 0, 6, 98, 75, 71, 68, 0, -1, 0, -1, 0, -1, -96, -67, -89, -109, 0, 0, 3, 48, 73, 68, 65, 84, 120, -100, -19, -42, 49, 74, 67, 81, 0, 68, -47, -81, -68, 52, 105, 83, -120, 85, 42, 65, -112, -12, 41, 44, 92, 64, -74, -26, 34, 92, -110, -115, -107, 32, -23, -19, 44, 4, 9, -60, 85, 60, 62, 92, -50, 89, -63, 52, 23, -26, -26, -70, 44, -41, 5, 104, 58, -99 - - - and continues - - - ]

 

Байты — это целые числа. Будем надеяться, что изображение трех предыдущих баров состоит из всех этих байтов. Идея состоит в том, чтобы программист изменил некоторые байты, изменил изображение, а затем сохранил результат; затем повторно отобразите его с помощью средства просмотра изображений, представляя измененное изображение. Однако это дополнительное расписание не рассматривается в этой статье.

 

Чтение в массив

Метод readAllBytes() возвращает массив байтов. Итак, просто получите возвращаемые значения с массивом байтов, как показано в следующем коде:

byte[] arr = new byte[1000];

try{

FileInputStream fir = new FileInputStream("dir1/bars.png");



arr = fir.readAllBytes();

            }

catch(Exception e) {

e.getMessage();

            }



            for (int i=0; i<arr.length; i++)

System.out.print(arr[i] + ", ");

System.out.println();

 

Код начинается с объявления массива, который получит байты. Размер (длина) здесь должен быть выше предполагаемого размера. Предполагаемый размер можно получить с помощью метода available(). Основной код находится в блоке try. Результат:

-119, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 0, -7, 0, 0, 0, -10, 8, 6, 0, 0, 0, 20, 25, 33, 69, 0, 0, 0, 6, 98, 75, 71, 68, 0, -1, 0, -1, 0, -1, -96, -67, -89, -109, 0, 0, 3, 48, 73, 68, 65, 84, 120, -100, -19, -42, 49, 74, 67, 81, 0, 68, -47, -81, -68, 52, 105, 83, -120, 85, 42, 65, -112, -12, 41, 44, 92, 64, -74, -26, 34, 92, -110, -115, -107, 32, -23, -19, 44, 4, 9, -60, 85, 60, 62, 92, -50, 89, -63, 52, 23, -26, -26, -70, 44, -41, 5, 104, 58, -99, - - - and continues - - -

 

Этот вывод и предыдущий совпадают на компьютере автора.

 

Вывод

Локальные текстовые и байтовые файлы могут быть прочитаны. Чтобы прочитать текстовый файл, используйте класс потока FileReader. Чтобы прочитать байтовый файл, используйте класс потока FileInputStream. Оба класса находятся в пакете java.io.*, который необходимо импортировать. Эти два класса имеют конструкторы и методы, обеспечивающие чтение. Мы надеемся, что эта статья была вам полезна. Дополнительные советы и руководства см. в других статьях Linux Hint.



2022-02-15T12:15:57
Java

Добавление DataFrame в Pandas

Pandas — это специальный пакет Python, основанный на анализе, который специально используется для оценки и контрабанды данных Python. Он предлагает функцию «DataFrame()», которая была популярна для выравнивания данных Python в строках и столбцах, то есть в матричной форме. Как следует из названия, функция «append()» используется для добавления чего-либо в конец некоторой структуры. Таким образом, мы можем сказать, что в pandas функция append() должна использоваться для добавления данных из одного фрейма данных в конец другого фрейма данных. Таким образом, мы будем реализовывать некоторые примеры Python в Spyder 3, чтобы увидеть работу функции pandas DataFrame.Append() в Windows 10. Давайте начнем.

 

Пример 01:

Давайте начнем с первого примера, чтобы увидеть, как можно инициализировать фреймы данных Python с помощью pandas. В инструменте Python Spyder 3 мы импортировали пакет panda с ключевым словом «import» как объект «pd». Это будет использоваться для инициализации фрейма данных в коде. Итак, мы добавили новую переменную d1, получая новый фрейм данных pandas через объект «pd», используя функцию «DataFrame()». Функция DataFrame() предназначена для создания фрейма данных табличной формы при добавлении двух списков 2*2, т.е. строк в столбцы. Столбцы были названы как 1 и 2, используя структуру списка для них. Индексы для строк были объявлены как 1 и 2. Оператор печати здесь для вывода фрейма данных «d1» на консоль.

После создания первого фрейма данных мы также создали еще один фрейм данных тем же методом. Единственное изменение здесь в списках значений, т.е. другие значения. Оператор печати отображает второй фрейм данных d2 на консоли. Теперь предпоследний оператор печати сообщает нам, что мы будем отображать фрейм данных добавления. Таким образом, второй фрейм данных d2 был добавлен в конец первого фрейма данных d2 с помощью функции append(). Оператор печати отображает добавленный фрейм данных.

import pandas as pd

d1 = pd.DataFrame([['a', 'b'], ['d', 'e']], columns=list('12'), index=['1', '2'])

print("Dataframe 1 ...")

print(d1)

d2 = pd.DataFrame([['c', 'f'], ['g', 'h']], columns=list('12'), index=['1', '2'])

print("Dataframe 2 ...")

print(d2)

print("Appended Dataframe...")

print(d1.append(d2))

 

После того, как код был завершен, пришло время выполнить этот код Python, чтобы увидеть результаты. Используйте кнопку запуска Spyder 3 на панели задач и вперед. Взамен мы получили следующий результат. Он показывает первый и второй кадры данных отдельно. После этого на выходе отображается второй фрейм данных, добавленный к первому фрейму данных.

Добавление кадра данных Pandas

 

Пример 02:

Давайте рассмотрим еще один пример использования функции append() для соединения двух фреймов данных панд. На этот раз мы использовали словари для создания фреймов данных. Итак, мы запустили программу для импорта пакета pandas как «pd». Два фрейма данных, d1 и d2, были созданы и инициализированы с помощью функции pandas DataFrame() с объектом «pd». Мы инициализировали библиотеку в обоих фреймах данных, имеющих два значения пары ключей. Ключ представляет собой некоторый алфавит или символ, и он одинаков в обоих фреймах данных «x» и «y». В то время как пара ключей «x» и «y» — это два списка совершенно разных значений в каждом для обоих фреймов данных. Первые два оператора печати предназначены для отображения кадров данных d1 и d2 отдельно с разрывом строки на «n».

import pandas as pd    

d1 = pd.DataFrame({"x":[1, 3, 5], "y":[2, 4, 6]})  #использование словаря

d2 = pd.DataFrame({"x":[7, 9, 11], "y":[8, 10, 12]}) #использование словаря

print(d1, "n")

print(d2, "n")

print(d1.append(d2))

 

После запуска этого кода мы получили кадры данных, отображаемые по отдельности, а затем вместе.

Добавление кадра данных Pandas

 

Пример 03:

Давайте взглянем на наш последний пример использования фрейма данных panda с функцией append(), чтобы объединить их в один. На этот раз мы начали наш код с создания двух словарей строкового типа, dic1 и dic2, после импорта пакета панды как объекта «pd». Оба словаря dic1 и dic2 имеют 3 значения пары ключей. Ключи имеют строковые типы, первые два значения — списки строкового типа, а последнее значение ключа — списки целочисленного типа. dic1 и dic2 были преобразованы во фрейм данных pandas путем вызова функции DataFrame с объектом pandas «pd». Кадры данных сохраняются в d1 и d2. Теперь функция append() используется для соединения d1 с d1 и сохраняется в переменной d3. Фрейм данных соединения d3 распечатывается с помощью функции print().

import pandas as pd

dic1 = {

    'Name': ['John', 'William', 'Laila'],

    'FName': ['Jack', 'Worth', 'Sky'],

    'Age': [36, 50, 25]

}

dic2 = {

    'Name':['Elizebath', 'Diana', 'Marshal'],

    'FName':['Patinson', 'Penty', ''],

   'Age': [56, 25, 29]

}

d1 = pd.DataFrame(dic1)

d2 = pd.DataFrame(dic2)

d3 = d1.append(d2)

print("nThe appended dataframe:n", d3)





Кадры данных были добавлены и отображены в соответствии с выводом.

Добавление кадра данных Pandas

 

Вывод:

В этой статье было рассмотрено использование функций pandas DataFrame() и append() в python при использовании инструмента Spyder 3. Мы использовали списки и словари целочисленных, символьных и строковых типов для создания фреймов данных и последующего добавления их вместе. Мы надеемся, что это руководство окажется полезным при использовании  или любого другого инструмента Python.



2022-02-12T22:43:50
Python

Что такое TreeMap в Java?

Значение узла в дереве называется ключом. Бинарное дерево — это дерево, в котором каждый узел имеет не более двух дочерних элементов. Двоичное дерево поиска (BST) — это дерево, в котором для каждого узла правый дочерний элемент больше или равен левому дочернему элементу. Это приводит к тому, что правая половина дерева имеет значения, обычно превышающие значения левой половины на каждом уровне. Это означает, что бинарное дерево поиска частично отсортировано (тип неполной сортировки). BST можно хранить в структуре, подобной массиву, где корневой узел является первым значением.

Бинарное дерево может быть преобразовано в различные самобалансирующиеся деревья с различными наборами дополнительных условий, такие как дерево AVL и красно-черное дерево.

TreeMap в Java — это красно-черное дерево. Однако каждый узел состоит из ключа и соответствующего значения (пары ключ/значение), а не только из ключа. Каждая пара ключ/значение будет одним элементом в структуре, подобной массиву. В этой статье объясняется, как использовать TreeMap в Java, начиная с двоичного дерева поиска, за которым следует красно-черное дерево, а затем Java TreeMap.

 

Бинарное дерево поиска

Ниже приведен пример бинарного дерева поиска:

Бинарное дерево поиска

 

У каждого узла есть ключ. Ключ (значение) для корневого узла равен 8. Левый дочерний узел равен 3, а правый дочерний узел равен 10 (10 >= 3). Можно видеть, что для любого узла, имеющего двух дочерних элементов, правый дочерний элемент больше или равен левому дочернему элементу. Кроме того, правая половина дерева имеет значения, превышающие значения левой половины дерева для каждого уровня.

Все значения приведенного выше дерева можно поместить в массив следующим образом:

8, 3, 10, 1, 6, , , , 14, 4, 7, , , , , , , 13, ,

 

Обратите внимание, что массив (дерево) начинается с 8; опускается до 3, затем поднимается выше 8 в 10; снижается до 1, повышается до 6, затем имеет NIL до 14; снижается до 4; повышается до 7; снова NIL; затем 13 и последний NIL.

8 — это первое значение с индексом 0. Это корневой узел (корневой родитель). Это не обязательно самое большое значение среди всех значений. Его первый потомок (3) имеет индекс 1, индекс которого равен 2(0) + 1, где 0 — индекс родителя. Его второй потомок (10) имеет индекс 2, что равно 2(0) + 2, где 0 — индекс родителя.

3 находится в индексе 1. Это родитель. Его первый потомок (1) имеет индекс 3, что равно 2(1) + 1, где 1 — индекс родителя. Его второй потомок (6) имеет индекс 4, что равно 2(1) + 2, где 1 — индекс родителя.

6 находится в индексе 4. Это родитель. Его первый потомок (4) имеет индекс 9, что равно 2(4) + 1, где 4 — индекс родителя. Его второй потомок (7) имеет индекс 10, что равно 2(4) + 2, где 4 — индекс родителя.

10 находится в индексе 3. Это родитель. У него нет первого (левого) потомка, который должен был быть с индексом 7, что равно 2(3) + 1, где 3 — индекс родителя. Его второй потомок (14) имеет индекс 8, что равно 2(3) + 2, где 3 — индекс родителя.

14 находится в индексе 8. Это родитель. Его первый потомок (13) имеет индекс 17, что равно 2(8) + 1, где 8 — индекс родителя. У него нет правого (второго) потомка, который должен был быть с индексом 18, что равно 2(8) + 2, где 8 — индекс родителя.

В общем, поскольку подсчет индексов начинается с 0. Пусть я представляю индекс родителя массива; и поэтому левый (первый) потомок родителя с индексом i имеет индекс 2i + 1; а его правый (второй) дочерний элемент имеет индекс 2i + 2. Некоторые ячейки в массиве могут быть пустыми; они не должны иметь значений.

 

Красно-черное дерево

Красно-черное дерево — это сбалансированное бинарное дерево поиска. Ниже приведено уже сбалансированное красно-черное дерево:

Красно-черное дерево

 

Сбалансированное дерево – это дерево небольшой высоты. Позиции узлов изменены и отмечены красным и синим цветами, чтобы иметь наименьшую возможную высоту дерева в его развитии.

Используя формулы 2i + 1 и 2i + 2, значения можно поместить в структуру, подобную массиву, следующим образом:

13, 8, 17, 1, 11, 15, 25, , 6, , , , , 22, 27

 

Обратите внимание, что массив начинается с 13, опускается до 8 и затем повышается до 17. Затем он опускается за пределы 8 до 1, а затем повышается до 11, затем до 15, затем до 25; от которого идет NIL, а затем опускается до 6. Перед 22 и 27 следуют NIL.

Массив сбалансированного дерева, такой как красно-черное дерево выше, имеет меньше NIL, чем его соответствующее несбалансированное двоичное дерево поиска. Длина массива сбалансированного дерева короче, чем у соответствующего несбалансированного дерева.

Красно-черное дерево — это частично упорядоченное дерево.

 

Пары ключ/значение для Java TreeMap

Предыдущее красно-черное дерево имеет только ключи в качестве значений узлов. Каждому целочисленному ключу может быть присвоено соответствующее строковое значение. В следующем списке есть те же ключи с соответствующими значениями:

13/thirteen, 8/eight, 17/seventeen, 1/one, 11/eleven, 15/fifteen, 25/twenty-five, 6/six, 22/twenty-two, 27/twenty-seven

 

Это пары ключ/значение, подходящие для Java TreeMap. Каждому ключу будет сопоставлено соответствующее значение. Пара ключ/значение называется записью карты в Java. Для Java TreeMap расположение узлов осуществляется по ключам (а не по значениям пар ключ/значение). Каждый ключ сопоставляется со своим значением.

 

Создание карты Java TreeMap

В Java TreeMap — это класс в пакете java.util.*, который следует импортировать. Этот класс имеет четыре конструктора, и в этой статье проиллюстрированы два конструктора.

Публичная древовидная карта ()

Это создает пустой TreeMap. Следующий сегмент кода иллюстрирует это:

TreeMap<Integer,String> tm = new TreeMap<Integer,String>();



tm.put(13, "thirteen"); tm.put(8, "eight"); tm.put(17, "seventeen"); tm.put(1, "one");



tm.put(11, "eleven"); tm.put(15, "fifteen"); tm.put(25, "twenty-five"); tm.put(6, "six");



tm.put(22, "twenty-two"); tm.put(27, "twenty-seven");

 

Метод put() включает пары ключ/значение в TreeMap. После всего этого TreeMap становится сбалансированным внутри.

 

Public TreeMap (Map<? extends K,? extends V> m)

Этот метод конструктора создает карту из другой уже созданной карты, как в следующем фрагменте кода:

TreeMap<Integer,String> tm = new TreeMap<Integer,String>();



tm.put(13, "thirteen"); tm.put(8, "eight"); tm.put(17, "seventeen"); tm.put(1, "one");



tm.put(11, "eleven"); tm.put(15, "fifteen"); tm.put(25, "twenty-five"); tm.put(6, "six");



tm.put(22, "twenty-two"); tm.put(27, "twenty-seven");



TreeMap<Integer,String> tm1 = new TreeMap<Integer,String>(tm);

 

tm1 создается из tm. После всего этого оба TreeMaps внутренне сбалансированы; с первым сбалансированным первым. Балансировка происходит, поскольку ключи включают пары.

 

Методы карты дерева Java

Публичный V put (ключ K, значение V)

Строго говоря, метод put() не добавляет пару ключ/значение. Он связывает определенное значение с определенным ключом. Если ключ уже существовал в TreeMap с другим значением, значение заменяется новым. Этот метод возвращает старое значение или ноль, если старого значения не было. Применение этого метода было продемонстрировано выше.

 

Публичный размер()

Этот метод возвращает количество сопоставлений ключ/значение (пар) в TreeMap. Следующий фрагмент кода показывает, как его использовать:

int it = tm.size();



System.out.println(it);

 

Результат равен 10, что указывает на то, что в этом объекте TreeMap имеется 10 пар ключ/значение.

 

Public V get (ключ объекта)

Этот метод возвращает значение, соответствующее аргументу, который является ключом. Возвращает null, если ключ не существует. Следующий код иллюстрирует это для пары ключ/значение: 11/»eleven» и для ключа 40, которого не существует:

String val = tm.get(11); String str = tm.get(40);



System.out.print(val + ", "); System.out.print(str + " ");



System.out.println();

 

Результат:

eleven, null

Открытый набор<K>keySet()

Этот метод возвращает набор ключей, которые находятся в TreeMap. Для отображения ключей необходимо использовать итератор. Следующий сегмент кода для предыдущего TreeMap иллюстрирует это:

Set<Integer> st = tm.keySet();



Iterator<Integer> iter = st.iterator();



while (iter.hasNext()) {



System.out.print(iter.next() + ", ");



}



System.out.println();





Результат:

1, 6, 8, 11, 13, 15, 17, 22, 25, 27,

 

Возвращаемый список полностью отсортирован (по возрастанию), хотя TreeMap имеет частичную внутреннюю сортировку.

 

Значения Public Collection<V>()

Это возвращает представление коллекции (список) всех значений в TreeMap без ключей. Для отображения значений необходимо использовать итератор. Следующий сегмент кода для предыдущего TreeMap иллюстрирует это:

Collection<String> col = tm.values();



Iterator<String> iter = col.iterator();



while (iter.hasNext()) {



System.out.print(iter.next() + ", ");



}



System.out.println();





Результат:

one, six, eight, eleven, thirteen, fifteen, seventeen, twenty-two, twenty-five, twenty-seven,

 

Значения отображаются на основе их полных отсортированных ключей (по возрастанию), хотя TreeMap имеет внутреннюю частичную сортировку.

 

Открытый набор<Map.Entry<K,V>> entrySet()

Это возвращает набор пар ключ/значение. Чтобы отобразить ключи и соответствующие им значения, необходимо использовать итератор. Следующий сегмент кода для вышеприведенной TreeMap иллюстрирует это:

Set<Map.Entry<Integer,String>> pairs = tm.entrySet();



Iterator<Map.Entry<Integer,String>> iter = pairs.iterator();



while (iter.hasNext()) {



Map.Entry<Integer,String> etry = iter.next();



int in = etry.getKey(); String str = etry.getValue();



System.out.println(in + " => " + str);



}





Результат:

1 => one



6 => six



8 => eight



11 => eleven



13 => thirteen



15 => fifteen



17 => seventeen



22 => twenty-two



25 => twenty-five



27 => twenty-seven

 

Пары были отображены на основе их полных отсортированных ключей (по возрастанию), хотя TreeMap имеет внутреннюю частичную сортировку.

 

Вывод

В Java TreeMap — это красно-черное дерево, которое является самобалансирующимся двоичным деревом поиска. В этой статье обсуждались часто используемые методы и конструкция Java TreeMap. Мы надеемся, что вы нашли эту информацию полезной.руководств.



2022-02-12T22:14:55
Java

Резервное копирование для экономных или бэкапимся в облака бесплатно

Публикуя статьи о резервном копировании я достаточно подробно описал как «готовить бэкапы» на серверах, но обошел стороной персональные компьютеры (далее ПК). А ведь данные на них не менее важны и так же нуждаются в резервировании. Тем более, что серверы есть не у всех, а ноутбук или компьютер у большинства — либо дома, либо на работе. Читать

Выбираем провайдера спутникового телевидения

Спутниковое телевидение – это специфическая ТВ-система, где сигнал от источника к абоненту поступает, благодаря искусственным спутникам. Расположенные на орбите спутники обеспечивают довольно качественные сигналы, а зона покрытия охватывает практически всю страну. Подробно о технологии читайте здесь https://internetsim.ru/kak-sputnikovoe-televidenie-luchshe-vybor-dlya-doma-i-dachi/.

Для установки спутникового ТВ на даче, в частном или загородном доме понадобится комплект специального оборудования. Обычно в такие наборы входит спутниковая антенна, ресивер, конвертер и смарт-карта. Пользователи отмечают хорошее качество сигнала и высокое разрешение видео. Подключить такой комплект можно в любой точке страны. Для подключения, помимо покупки и установки оборудования, нужно выбрать провайдера.

 

Спутниковое ТВ: какое выбрать

В России работает много провайдеров, которые продвигают спутниковое телевидение. Но есть крупные компании, услугами которых пользуются миллионы граждан:

  • Телекарта. У компании разработано множество предложений. Пользователи могут выбирать как минимальные, так и максимально полные пакеты. К преимуществам относят: высокое качество телетрансляций, каналы в HD-формате, качественная техподдержка абонентов. Минусы: дорогое оборудование и не совсем хорошее покрытие в некоторых регионах.
  • Континент ТВ. Провайдер предлагает бесплатные каналы, а также предоставляет возможность не оплачивать телеканалы, которые не интересны пользователю. Это позволяет существенно уменьшать размер абонентской платы. Достоинства выбора: можно выбирать ресиверы, экономить на оплате услуг. Но в некоторых местах России покрытие Континент ТВ низкокачественное.
  • Ростелеком. Существует компания достаточно давно, постоянно модернизирует услуги, разрабатывает новые предложения. Преимущество спутникового ТВ от РТК – простая установка и стоимость оборудования. Абоненты могут самостоятельно установить и настроить систему. Минусы: совсем небольшое покрытие, куда попадают лишь некоторые регионы России.
  • Триколор. Один из крупнейших поставщиков спутникового телевидения. Стоимость комплектов устройств в среднем составляет около 5–7 тыс. р. тарифные планы также доступны. Можно подобрать вариант до 2 тысяч рублей в год. Оборудование Триколор разнообразное, можно подключать и отключать разные дополнительные услуги.
  • НТВ Плюс. Еще один популярный спутниковый оператор, который разрабатывает массу тарифов и пакетов. Пользователи отмечают стабильный прием сигнала по всей РФ, простые настройки и множество телеканалов.
  • МТС. Оператор сотовой связи вот уже несколько лет выступает в качестве поставщика спутникового ТВ. МТС транслирует некоторые каналы в HD и UHD, но только при подключении специального CAM-модуля.

Перед подключением желательно изучить предложения всех провайдеров.



2022-02-11T13:14:10
Сети