Я обновил код до правильного, это одно из возможных решений
/ ****************************************** /
У меня есть набор данных кортежей, содержащий два значения (string line ,integer length_of_line
), и я пытаюсь вернуть кортежи с максимальным значением length_of_line
Я пытался использовать функцию .maxBy()
, но на выходе получился только один кортеж.
public class PalindromeTaskImpl implements PalindromeTask {
@Override
public Set<String> solve(String inputFile) throws Exception {
class PalindromeChecker implements FlatMapFunction<String, Tuple2<String, Integer>> {
@Override
public void flatMap(String str, Collector<Tuple2<String, Integer>> out) {
String whatever = new String(str);
str = str.replace(" ","");
int startIndex = 0;
int endIndex = str.length() - 1;
while (startIndex < endIndex) {
char getAtl = str.charAt(startIndex);
char getAth = str.charAt(endIndex);
if (getAtl != getAth) {
out.collect(new Tuple2<String, Integer>(str, 0));
return;
}
startIndex++;
endIndex--;
}
out.collect(new Tuple2<String, Integer>(whatever, str.length()));
}
}
ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
//DataSet<String> inputData = env.readTextFile(inputFile);
DataSet<String> inputData = env.fromElements(
"abc cba 33\n" +
" abc abc cba cba \n" +
"4 qwer fg gf rewq 4\n" +
"a qder fg gf redq a\n" +
"a qder fg abc cba gf redq a\n" +
"abcde abcde edcba edcba 33 "
);
DataSet<String> oneLine =inputData.flatMap(new FlatMapFunction<String, String> () {
public void flatMap(String value, Collector<String> oneLine) {
for (String token : value.split("\n")) {
oneLine.collect(token);
}
}
});
DataSet<Tuple2<String, Integer>> PalindromeCheckerResults =
oneLine.flatMap(new PalindromeChecker());
DataSet<Tuple2<String, Integer>> palindromeSentence = PalindromeCheckerResults.maxBy(1);
int maxVal = palindromeSentence.collect().get(0).f1;
DataSet<String> result =
PalindromeCheckerResults.filter(new FilterFunction<Tuple2<String, Integer>>() {
@Override
public boolean filter(Tuple2<String, Integer> stringIntegerTuple2) throws Exception {
return stringIntegerTuple2.f1 == maxVal;
}
})
.flatMap(new FlatMapFunction<Tuple2<String,Integer>, String>() {
public void flatMap(Tuple2<String,Integer> value, Collector<String> result) {
{result.collect(value.f0);
}
}
});
Set<String> finalSetResult = null;
try {
finalSetResult = new HashSet<String>(result.collect());
} catch (Exception e) {
e.printStackTrace();
}
return finalSetResult;
}
}
Приведенная выше функция палиндрома проверяет, является ли строка палиндромом, а затем возвращает строку с ее длиной, еслиэто палиндром или 0, если это не так. Выход tuple2 (string,integer)
. Когда я запускаю его с sampleData.flatMap(new PalindromeCheck()).maxBy(1);
, код над выводом выглядит так:
(a qder fg gf redq a, 19)
, тогда как ожидаемый результат должен быть:
(4 кв. Ф. Ст., Д. 4,19)
(кв. Ф. Ст., 19)