Это мое решение с использованием наборов данных. Это дало бы безопасность типов и более чистый код. Но должен был бы оценить производительность. Это не должно сильно варьироваться.
case class EmployeeOperations(id: Int, operation: String, viewName: String,DiectoryName: String, query: String)
val data = Seq(
EmployeeOperations(0, "Load", "employeeview", "employee.empdetails", ""),
EmployeeOperations(1, "Query", "employeecountview", "", "select count(*) from employeeview"),
EmployeeOperations(2, "store", "employeecountview", "", "")
)
val ds: Dataset[EmployeeOperations] = spark.createDataset(data)(Encoders.product[EmployeeOperations])
printOperation(ds).show
def printOperation(ds: Dataset[EmployeeOperations])={
ds.map(x => x.operation match {
case "Query" => println("matching Query"); "Query"
case "Load" => println("matching Load"); "Load"
case "store" => println("matching store"); "store"
case _ => println("Found something else") ;"Nothing"
}
)
}
Я вернул здесь только строку для тестирования. Вы можете вернуть любой примитивный тип. Это вернуло бы:
scala> printOperation(ds).show
matching Load
matching Query
matching store
+-----+
|value|
+-----+
| Load|
|Query|
|store|
+-----+
Просто сравните последние n символов, используя std :: string :: compare
:
#include <iostream>
bool hasEnding (std::string const &fullString, std::string const &ending) {
if (fullString.length() >= ending.length()) {
return (0 == fullString.compare (fullString.length() - ending.length(), ending.length(), ending));
} else {
return false;
}
}
int main () {
std::string test1 = "binary";
std::string test2 = "unary";
std::string test3 = "tertiary";
std::string test4 = "ry";
std::string ending = "nary";
std::cout << hasEnding (test1, ending) << std::endl;
std::cout << hasEnding (test2, ending) << std::endl;
std::cout << hasEnding (test3, ending) << std::endl;
std::cout << hasEnding (test4, ending) << std::endl;
return 0;
}
вы можете использовать string :: rfind
Полный пример, основанный на комментариях:
bool EndsWith(string &str, string& key)
{
size_t keylen = key.length();
size_t strlen = str.length();
if(keylen =< strlen)
return string::npos != str.rfind(key,strlen - keylen, keylen);
else return false;
}
Пусть a
будет строкой, а b
- строкой, которую вы ищете. Используйте a.substr
, чтобы получить последние n символов a
и сравнить их с b (где n - длина b
)
Или используйте std :: equal
(include
)
Пример:
bool EndsWith(const string& a, const string& b) {
if (b.size() > a.size()) return false;
return std::equal(a.begin() + a.size() - b.size(), a.end(), b.begin());
}
Этой цели может служить метод std :: mismatch
, если он используется для обратной итерации от конца обеих строк:
const string sNoFruit = "ThisOneEndsOnNothingMuchFruitLike";
const string sOrange = "ThisOneEndsOnOrange";
const string sPattern = "Orange";
assert( mismatch( sPattern.rbegin(), sPattern.rend(), sNoFruit.rbegin() )
.first != sPattern.rend() );
assert( mismatch( sPattern.rbegin(), sPattern.rend(), sOrange.rbegin() )
.first == sPattern.rend() );
Используйте эту функцию:
inline bool ends_with(std::string const & value, std::string const & ending)
{
if (ending.size() > value.size()) return false;
return std::equal(ending.rbegin(), ending.rend(), value.rbegin());
}