Как вернуть строки с максимальной длиной в наборе данных - PullRequest
0 голосов
/ 26 октября 2019

Я обновил код до правильного, это одно из возможных решений

/ ****************************************** /

У меня есть набор данных кортежей, содержащий два значения (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)

...