Qt - klasa QStringList do przechowywania ciągów tekstowych

Autor podstrony: Krzysztof Zajączkowski

Stronę tą wyświetlono już: 2884 razy

Biblioteka Qt udostępnia szereg klas umożliwiających przechowywanie wielu elementów tego samego typu. Jedną z takich klas jest klasa QStringList, która pozwala na przechowywanie elementów typu QString. Obiekt klasy QStringList jest tworzony, gdy tekst zawarty w klasie QString zostanie poddany parsowaniu przy użyciu metody split, czego przykładem jest poniższy kod:

QString data("100;200;300;400;500"); QStringList dataList = data.split(';'); qDebug() << data; qDebug() << dataList;

Wynik działania powyższego kodu:

"100;200;300;400;500"
("100", "200", "300", "400", "500")

Dodawanie elementów do obiektu klasy QStringList

Dodanie kolejnych elementów można przeprowadzić na kilka różnych sposobów, jednym z nich jest przypisanie w stylu C++ 11:

QStringList list = {"string1", "string2"}; qDebug() << list;

Można również dodawać na różne sposoby kolejne elementy do takiej listy:

QStringList list = {"string1", "string2"}; qDebug() << list; list.append("string3"); list.append({"string4", "string5"}); qDebug() << list; list.prepend("string6"); qDebug() << list; list << "string7" << "string9"; qDebug() << list; list += "string10"; list += {"string11", "string12"}; qDebug() << list; list.push_back("string13"); list.push_front("string14"); qDebug() << list; list.insert(list.begin() + 2, "string15");

Wynik działania powyższego kodu:

("string1", "string2")
("string1", "string2", "string3", "string4", "string5")
("string6", "string1", "string2", "string3", "string4", "string5")
("string6", "string1", "string2", "string3", "string4", "string5", "string7", "string9")
("string6", "string1", "string2", "string3", "string4", "string5", "string7", "string9", "string10", "string11", "string12")
("string14", "string6", "string1", "string2", "string3", "string4", "string5", "string7", "string9", "string10", "string11", "string12", "string13")
("string14", "string6", "string1", "string15", "string2", "string3", "string4", "string5", "string7", "string9", "string10", "string11", "string12", "string13")

Pozyskiwanie informacji o liczbie elementów zawartych w liście

Istnieją dwie metody length i size, które zwracają liczbę elementów zawartych w obiekcie klasy QStringList.

Iterowanie po elementach listy

Iterowanie można wykonać na kilka sposobów. Pierwszy z nich wykorzystuje indeksowanie:

QStringList list = {"string1", "string2", "string3"}; for(int i = 0; i < list.length(); i++){ qDebug() << list.at(i); }

Można też iterować wykorzystując wskaźniki:

QStringList list = {"string1", "string2", "string3"}; for(QStringList::iterator i = list.begin(); i < list.end(); i++){ qDebug() << *i; }

Jeżeli dodana została obsługa standardu C++ 11 można sobie ułatwić życie iterując w następujący sposób:

QStringList list = {"string1", "string2", "string3"}; for(auto element: list){ qDebug() << element; }

I w końcu można iterować po elementach listy w stylu Javy:

QStringList list = {"string1", "string2", "string3"}; QStringListIterator javaStyleIterator(list); while (javaStyleIterator.hasNext()) qDebug() << javaStyleIterator.next();

Łączenie elementów listy

Klasa QStringList dysponuje metodą join umożliwiającą połączenie elementów w jeden ciąg znaków z wykorzystaniem podanego separatora. Oto przykład:

QStringList list = {"string1", "string2", "string3"}; QString data1 = list.join("[separator]"); qDebug() << data1; QString data2 = list.join(';'); qDebug() << data2;

Wynik działania powyższego kodu:

"string1[separator]string2[separator]string3"
"string1;string2;string3"

Sprawdzanie, czy lista zawiera element z podanym tekstem

Za pomocą metody contains można stwierdzić w sposób jednoznaczny, czy lista zawiera element z podanym ciągiem znaków. Oto przykład:

QStringList countries = {"Polska", "Wielka Brytania", "Belgia"}; if(countries.contains("Polska")){ qDebug() << "Polska jest na liście zaproszonych"; } if(!countries.contains("Niemcy")){ qDebug() << "Niemcy nie są na liście zaproszonych"; }

Wynik działania powyższego kodu:

Polska jest na liście zaproszonych

Niemcy nie są na liście zaproszonych

Domyślnie przeszukiwanie jest nieczułe na wielkości liter, jeżeli jednak zachodzi potrzeba przeszukiwania z uwzględnieniem wielkości liter to istnieje taka możliwość:

if(countries.contains("polska", Qt::CaseInsensitive)){ qDebug() << "Ktoś napisał Polska z małej litery!"; }

Znajdowanie indeksu elementu zawierającego podany ciąg znaków lub dopasowanie wyrażenia regularnego

Można również za pomocą metody indexOf lub lastIndexOf znaleźć pierwszą lub ostatnią pozycję szukanego dopasowania wyrażenia regularnego. Oto przykład:

QStringList countries = {"Polska Pl", "Wielka Brytania UK", "Belgia Be"}; int index = countries.indexOf(QRegExp(".*\\bPl\\b")); if(index != -1){ qDebug() << countries.at(index); }

Wynik działania powyższego kodu:

"Polska Pl"

Wyciąganie listy elementów spełniających określone warunki dopasowania do ciągu znaków lub wzorca

Lista QStringList umożliwia filtrowanie elementów w niej zawartych za pomocą metody filter w następujący przebiegły sposób:

QStringList codes; // tworzę sobie listę kodów do późniejszego przefiltrowania for(int i = 0; i < 100; i++){ for(int j = 0; j < 1000; j++){ codes.push_back(QString("%L1-%L2").arg((int)i, 2, 10, QLatin1Char('0')).arg((int)j, 3, 10, QLatin1Char('0'))); } } // wyciągam kod o numerze "00-000" qDebug() << codes.filter("00-000"); // wyciągam listę wszystkich kodów kończących się na 009 qDebug() << codes.filter(QRegExp("\d\d-009"));

Wynik działania powyższego kodu:

("00-000")
("00-009", "01-009", "02-009", "03-009", "04-009", "05-009", "06-009", "07-009", "08-009", "09-009", "10-009", "11-009", "12-009", "13-009", "14-009", "15-009", "16-009", "17-009", "18-009", "19-009", "20-009", "21-009", "22-009", "23-009", "24-009", "25-009", "26-009", "27-009", "28-009", "29-009", "30-009", "31-009", "32-009", "33-009", "34-009", "35-009", "36-009", "37-009", "38-009", "39-009", "40-009", "41-009", "42-009", "43-009", "44-009", "45-009", "46-009", "47-009", "48-009", "49-009", "50-009", "51-009", "52-009", "53-009", "54-009", "55-009", "56-009", "57-009", "58-009", "59-009", "60-009", "61-009", "62-009", "63-009", "64-009", "65-009", "66-009", "67-009", "68-009", "69-009", "70-009", "71-009", "72-009", "73-009", "74-009", "75-009", "76-009", "77-009", "78-009", "79-009", "80-009", "81-009", "82-009", "83-009", "84-009", "85-009", "86-009", "87-009", "88-009", "89-009", "90-009", "91-009", "92-009", "93-009", "94-009", "95-009", "96-009", "97-009", "98-009", "99-009")

Usuwanie elementów z listy

Istnieje szereg metod, które umożliwiają usuwanie elementów z listy QStringList. Oto przykład ich użycia:

QStringList data = {"100", "200", "300", "400", "500", "600", "600", "700", "100"}; qDebug() << data; data.removeAll("600"); // usuwam wszystkie ciągi znaków == "600" qDebug() << data; data.removeDuplicates(); // usuwam wszystkie duplikaty qDebug() << data; data.removeFirst(); // usuwam pierwszy element qDebug() << data; data.removeLast(); // usuwam ostatni element qDebug() << data; data.removeAt(2); // usuwam 3 element (indeksowanie od 0) qDebug() << data;

Wynik działania powyższego kodu:

("100", "200", "300", "400", "500", "600", "600", "700", "100")
("100", "200", "300", "400", "500", "700", "100")
("100", "200", "300", "400", "500", "700")
("200", "300", "400", "500", "700")
("200", "300", "400", "500")
("200", "300", "500")
Propozycje książek