Если вы похожи на меня, когда я впервые начал использовать Java, я хотел использовать оператор «==» для проверки того, были ли два экземпляра String одинаковыми, но к лучшему или худшему это не правильный способ сделать это в Java.
В этом уроке я продемонстрирую несколько разных способов правильно сравнить строки Java, начиная с подхода, который я использую большую часть времени. В конце этого руководства по сопоставлению Java String я также обсужу, почему оператор «==» не работает при сравнении строк Java.
Вариант 1: Сравнение строк Java с методом equals Большая часть (возможно, в 95% случаев). Я сравниваю строки с методом equals класса Java String следующим образом:
if (string1.equals(string2))
Этот метод String равен методу для двух строк Java, и если они содержат точно такую же строку символов, они считаются равными.
Взглянув на быстрый пример сравнения строк с методом equals, если был выполнен следующий тест, две строки не будут считаться равными, поскольку символы не являются точно такими же (случай символов различен):
String string1 = "foo";
String string2 = "FOO";
if (string1.equals(string2))
{
// this line will not print because the
// java string equals method returns false:
System.out.println("The two strings are the same.")
}
Но, когда две строки содержат одну и ту же строку символов, метод equals вернет true, как в этот пример:
String string1 = "foo";
String string2 = "foo";
// test for equality with the java string equals method
if (string1.equals(string2))
{
// this line WILL print
System.out.println("The two strings are the same.")
}
Вариант 2: Сравнение строк с методом equalsIgnoreCase
В некоторых строковых сравнительных тестах вы захотите игнорируйте, являются ли строки строчными или строчными. Если вы хотите проверить свои строки на равенство в этом случае нечувствительным образом, используйте метод equalsIgnoreCase класса String, например:
String string1 = "foo";
String string2 = "FOO";
// java string compare while ignoring case
if (string1.equalsIgnoreCase(string2))
{
// this line WILL print
System.out.println("Ignoring case, the two strings are the same.")
}
Вариант 3: сравнение строк Java с методом compareTo
Существует также третий, менее распространенный способ сравнения строк Java, и это с методом сравнения String класса. Если две строки точно совпадают, метод compareTo вернет значение 0 (ноль). Ниже приведен краткий пример того, как выглядит этот метод сравнения строк:
String string1 = "foo bar";
String string2 = "foo bar";
// java string compare example
if (string1.compareTo(string2) == 0)
{
// this line WILL print
System.out.println("The two strings are the same.")
}
Пока я пишу об этой концепции равенства в Java, важно отметить, что язык Java включает в себя метод equals в базовый класс Java Object. Всякий раз, когда вы создаете свои собственные объекты, и вы хотите предоставить средства для проверки того, являются ли два экземпляра вашего объекта «равными», вы должны переопределить (и реализовать) этот метод equals в своем классе (точно так же, как язык Java предоставляет это равенство / сравнение в методе String равно).
Вы можете посмотреть на это ==, .equals (), compareTo () и compare ()
Вы также можете полностью избежать здесь, используя mutate_at()
.
library(tidyverse)
(x <- tibble(
num = 1:3,
month = month.abb[num]
))
#> # A tibble: 3 x 2
#> num month
#> <int> <chr>
#> 1 1 Jan
#> 2 2 Feb
#> 3 3 Mar
x %>%
mutate(month = tolower(month))
#> # A tibble: 3 x 2
#> num month
#> <int> <chr>
#> 1 1 jan
#> 2 2 feb
#> 3 3 mar
foo <- function(df, col) {
mutate_at(df, .vars = col, .funs = tolower)
}
foo(x, "month")
#> # A tibble: 3 x 2
#> num month
#> <int> <chr>
#> 1 1 jan
#> 2 2 feb
#> 3 3 mar
this <- "month"
foo(x, this)
#> # A tibble: 3 x 2
#> num month
#> <int> <chr>
#> 1 1 jan
#> 2 2 feb
#> 3 3 mar
Создано в 2019-03-09 из пакета представитель (v0.2.1.9000) sup>
Возвращаясь к исходному примеру, просто используйте ensym()
для преобразования текстовых аргументов в символы, в этом случае нет необходимости в выражении.
library(ggplot2)
col <- "cut"
foo <- function(df, col){
col <- rlang::sym(col)
dplyr::mutate(df, !!col := tolower(!!col))
}
foo(diamonds, col)
#> # A tibble: 53,940 x 10
#> carat cut color clarity depth table price x y z
#> <dbl> <chr> <ord> <ord> <dbl> <dbl> <int> <dbl> <dbl> <dbl>
#> 1 0.23 ideal E SI2 61.5 55 326 3.95 3.98 2.43
#> 2 0.21 premium E SI1 59.8 61 326 3.89 3.84 2.31
#> 3 0.23 good E VS1 56.9 65 327 4.05 4.07 2.31
#> 4 0.290 premium I VS2 62.4 58 334 4.2 4.23 2.63
#> 5 0.31 good J SI2 63.3 58 335 4.34 4.35 2.75
#> 6 0.24 very good J VVS2 62.8 57 336 3.94 3.96 2.48
#> 7 0.24 very good I VVS1 62.3 57 336 3.95 3.98 2.47
#> 8 0.26 very good H SI1 61.9 55 337 4.07 4.11 2.53
#> 9 0.22 fair E VS2 65.1 61 337 3.87 3.78 2.49
#> 10 0.23 very good H VS1 59.4 61 338 4 4.05 2.39
#> # … with 53,930 more rows
Создано в 2019-03-11 с помощью пакета представитель (v0.2.1) sup>
library(tidyverse)
col <- "cut"
foo <- function(df, col) {
df %>%
mutate(!!sym(col) := tolower(!!sym(col)))
}
foo(diamonds, col)
Извлечь Передать строку как имя переменной в dplyr :: filter .