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

Stronę tą wyświetlono już: 32 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:

Listing 1
  1. QString data("100;200;300;400;500");
  2. QStringList dataList = data.split(';');
  3. qDebug() << data;
  4. 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:

Listing 2
  1. QStringList list = {"string1", "string2"};
  2. qDebug() << list;

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

Listing 3
  1. QStringList list = {"string1", "string2"};
  2. qDebug() << list;
  3. list.append("string3");
  4. list.append({"string4", "string5"});
  5. qDebug() << list;
  6. list.prepend("string6");
  7. qDebug() << list;
  8. list << "string7" << "string9";
  9. qDebug() << list;
  10. list += "string10";
  11. list += {"string11", "string12"};
  12. qDebug() << list;
  13. list.push_back("string13");
  14. list.push_front("string14");
  15. qDebug() << list;
  16. 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:

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

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

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

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

Listing 6
  1. QStringList list = {"string1", "string2", "string3"};
  2. for(auto element: list){
  3. qDebug() << element;
  4. }

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

Listing 7
  1. QStringList list = {"string1", "string2", "string3"};
  2. QStringListIterator javaStyleIterator(list);
  3. while (javaStyleIterator.hasNext())
  4. 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:

Listing 8
  1. QStringList list = {"string1", "string2", "string3"};
  2. QString data1 = list.join("[separator]");
  3. qDebug() << data1;
  4. QString data2 = list.join(';');
  5. 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:

Listing 9
  1. QStringList countries = {"Polska", "Wielka Brytania", "Belgia"};
  2. if(countries.contains("Polska")){
  3. qDebug() << "Polska jest na liście zaproszonych";
  4. }
  5. if(!countries.contains("Niemcy")){
  6. qDebug() << "Niemcy nie są na liście zaproszonych";
  7. }

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ść:

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

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:

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

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:

Listing 12
  1. QStringList codes;
  2. // tworzę sobie listę kodów do późniejszego przefiltrowania
  3. for(int i = 0; i < 100; i++){
  4. for(int j = 0; j < 1000; j++){
  5. codes.push_back(QString("%L1-%L2").arg((int)i, 2, 10, QLatin1Char('0')).arg((int)j, 3, 10, QLatin1Char('0')));
  6. }
  7. }
  8. // wyciągam kod o numerze "00-000"
  9. qDebug() << codes.filter("00-000");
  10. // wyciągam listę wszystkich kodów kończących się na 009
  11. 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:

Listing 13
  1. QStringList data = {"100", "200", "300", "400", "500", "600", "600", "700", "100"};
  2. qDebug() << data;
  3. data.removeAll("600"); // usuwam wszystkie ciągi znaków == "600"
  4. qDebug() << data;
  5. data.removeDuplicates(); // usuwam wszystkie duplikaty
  6. qDebug() << data;
  7. data.removeFirst(); // usuwam pierwszy element
  8. qDebug() << data;
  9. data.removeLast(); // usuwam ostatni element
  10. qDebug() << data;
  11. data.removeAt(2); // usuwam 3 element (indeksowanie od 0)
  12. 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")

Komentarze