У меня есть код ниже, где я беру массив строк и конвертирую их в массив символов. Как я могу преобразовать его, чтобы использовать лямбда-функцию?
У меня есть функция (countOcc
), для которой требуется массив символов (char[][]
), но я хотел сделать возможным ее использование с массивом строк (String[]
), используя метод toArray
строки.
public final int countOcc (String[] value) {
int m = 1;
for (String v : value) if (v.length() >= m) m = v.length();
char[][] a = new char[value.length][m];
for (int i = 0; i < value.length; i++) a[i] = value[i].toCharArray();
return countOcc(a);
}
я пробовал использовать Arrays.stream().foreach()
, как показано ниже, но когда я делаю что-то вроде C++, это выдает ошибку
public final int countOcc (String[] value) {
int m = 1;
Arrays.stream(value).forEach(e -> {
if (e.length() >= m) m = e.length();
});
char[][] a = new char[value.length][m];
int c = 0;
Arrays.stream(value).forEach(e -> {
a[c] = e.toCharArray();
c++;
});
return countOcc(a);
}
у меня есть функция (countOcc), для которой требуется массив символов (char[][]), но я хотел сделать возможным ее использование с массивом строк (String[]), используя метод toArray строки @g00se
Я подозреваю, что вам нужен подсчет частоты символов, поэтому: Map<String, Long> counts = Arrays.stream(args).flatMapToInt(String::codePoints).mapToObj(Character::toString).collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));System.out.println(counts);
Особо обратите внимание, что границы char
долгое время были неадекватными, и в настоящее время все должно быть ориентировано на кодовые точки (int
). Итак, «символы» в конечном итоге превращаются в String
, как и должно быть, в клавишах Map
в моем примере.
Добро пожаловать в Stack Overflow. Ваша ошибка говорит вам, что внутри вашей лямбды вам не разрешено изменять переменную, существующую вне лямбды (вероятно, там говорится, что переменная должна быть «фактически окончательной»). Вы можете помочь нам быть уверенными, вставив сообщение об ошибке в свой вопрос. Итак, c++
не идет. Кроме того, при последующем предоставлении внутренних массивов их выделение с самого начала является просто пустой тратой. Итак, в вашем рабочем коде удалите первый цикл for-each и выделите массив, просто char[][] a = new char[value.length][];
оставив m
.
Если вы пытаетесь преобразовать String[]
в char[][]
, сделайте что-то вроде:
String[] value = {"foo", "bar", "fizz"};
char[][] a = Arrays.stream(value).map(s -> s.toCharArray()).toArray(char[][]::new);
затем вызовите другой метод
return countOcc(a);
спасибо, а у вас есть руководство по потокам?
Всегда лучше читать официальную документацию. Но в качестве введения вы можете прочитать эту статью от oracle . Baeldung также является хорошим веб-сайтом с простыми объяснениями и примерами. Вот введение и несколько продолжений
Кстати, s -> s.toCharArray()
можно заменить на String::toCharArray
(по крайней мере, чтобы соответствовать char[][]::new
)
Я подозреваю, что вам нужен подсчет частоты символов, поэтому вы можете использовать потоковую передачу и Collectors
для достижения этой цели.
Особо обратите внимание, что границы char долгое время были неадекватными, и в настоящее время все должно быть ориентировано на кодовые точки (int
). Итак, «символы» в конечном итоге превращаются в String
, как и должно быть, в клавишах Map
в примере ниже.
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
public class CharacterFrequencyCounter {
public static void main(String[] args) throws Exception {
String flag = new String(new int[] { 0x1F1EC, 0x1F1E7 }, 0, 2);
String[] text = new String[] {
"This is the flag of Great Britain",
flag };
System.out.println(Arrays.toString(text));
System.out.println(CharacterFrequencyCounter.getCounts(text));
}
public static Map<String, Long> getCounts(String... strings) {
return Arrays.stream(strings).flatMapToInt(String::codePoints).mapToObj(Character::toString)
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
}
}
Какова цель кода, который вы пишете?