Sortowanie vectora 2d

0

Mam problem z sortowaniem dwuwymiarowego vectora <string>. Algorytm przestaje sortować po znalezieniu największej "zmiennej"; np. dla 100 1 1000 150 249 zwraca 1 100 1000 150 249. Kod:

void sort(const int column_number = 0) {
	std::sort(begin(myVector), end(myVector), [column_number](const std::vector<std::string> &lhs, const std::vector<std::string> &rhs) 
        {return lhs[column_number] < rhs[column_number]; });
}
2

przeciez porownujesz stringi. Wytlumacz mi co oznacza wiekszy przy stringu?

2

Te ciągi są sortowane alfabetycznie – dlatego wektor wynikowy wygląda jak wygląda.

Jeśli chcesz sortować po liczbowej wartości to albo użyj konwersji i porównuj liczby, albo do wektora wrzucaj liczby, a nie ciągi znaków. Druga opcja rekomendowana, bo trzymanie łańcuchów w tym przypadku nie ma sensu.

0

@furious programming: Każda liczba jest w innej kolumnie (myVector[x][1], myVector[x+1][1] itd. - liczby sa pod [1]). Nie mogę też użyć konwersji, bo nie zawsze będzie int.

1

Sugerujesz, że Twój problem nie posiada rozwiązania?

3
ranger281 napisał(a):

Rozumiem. Moge to jakos zmienic, zeby dzialalo w zamierzony sposob zarowno dla string, jak i int?

Jeśli masz wymieszane dane w tej tabelce, ale pomimo tego chcesz sortować ciągi liczbowe jako liczby (po wartościach), to musisz sprawdzać co zawiera bieżąca para ciągów znaków. Jeśli w obu przypadkach będą to liczby, to dokonujesz konwersji na int i porównujesz po wartościach, a jeśli nie to tak jak masz teraz.

0

Zrobiłem jak radziłeś i kod działa. Dziękuję za pomoc.

std::sort(begin(myVector), end(myVector), [column_number](const std::vector<std::string> &lhs, const std::vector<std::string> &rhs) 
		{
			int int_value_1 = 0;
			int int_value_2 = 0;
			bool is_int = false;
			try {
				int_value_1 = std::stoi(lhs[column_number - 1]);
				int_value_2 = std::stoi(rhs[column_number - 1]);
				is_int = true;
			}
			catch(const std::invalid_argument&) {
				is_int = false;
			}
			if (is_int)
				return int_value_1 < int_value_2;
			else
				return lhs[column_number - 1] < rhs[column_number - 1]; 
		});
2

Nienawidzę jak ludzie piszą takie skomplikowane lambdy.
Jak to potem przetestować? Aż się prosi o osobną funkcję.

Czy tak nie jest czytelniej:

bool compareAsNumbersThenAsStrings(const std::string &a, const std::string &b) {
    try {
          return std::stoi(a) < std::stoi(b);
    }
    catch(const std::invalid_argument&) {
          return a < b;
    }
}

std::sort(begin(myVector), end(myVector), [column_number](const std::vector<std::string> &lhs, const std::vector<std::string> &rhs) {
                   return compareAsNumbersThenAsStrings(lhs[column_number - 1], rhs[column_number - 1]);
           });
0

@ranger281: Zbytnio nie rozumiem dlaczego użyłeś wyjątków, skoro doskonale zdajesz sobie sprawę, że wektor będzie zawierać dane, których nie da się przekonwertować na liczby. Skoro masz tego świadomość to co to za wyjątek? :>

Tylko pytam.

1 użytkowników online, w tym zalogowanych: 0, gości: 1