Как найти самую длинную строку в массиве

Is there a short way to find the longest string in a string array?

Something like arr.Max(x => x.Length);?

Brad Mace's user avatar

Brad Mace

27.1k17 gold badges100 silver badges146 bronze badges

asked Jun 29, 2011 at 13:16

Neir0's user avatar

0

Available since Javascript 1.8/ECMAScript 5 and available in most older browsers:

var longest = arr.reduce(
    function (a, b) {
        return a.length > b.length ? a : b;
    }
);

Otherwise, a safe alternative:

var longest = arr.sort(
    function (a, b) {
        return b.length - a.length;
    }
)[0];

Ruben Helsloot's user avatar

answered Jun 29, 2011 at 13:36

deceze's user avatar

decezedeceze

508k85 gold badges739 silver badges882 bronze badges

2

A new answer to an old question: in ES6 you can do shorter:

Math.max(...(x.map(el => el.length)));

answered Apr 9, 2017 at 9:10

David Veszelovszki's user avatar

4

I would do something like this

var arr = [
  'first item',
  'second item is longer than the third one',
  'third longish item'
];

var lgth = 0;
var longest;

for (var i = 0; i < arr.length; i++) {
  if (arr[i].length > lgth) {
    var lgth = arr[i].length;
    longest = arr[i];
  }
}

console.log(longest);

Ruben Helsloot's user avatar

answered Jun 29, 2011 at 13:33

Jason Gennaro's user avatar

Jason GennaroJason Gennaro

34.4k8 gold badges65 silver badges86 bronze badges

2

Maybe not the fastest, but certainly pretty readable:

function findLongestWord(array) {
  var longestWord = "";

  array.forEach(function(word) {
    if(word.length > longestWord.length) {
      longestWord = word;
    }
  });

  return longestWord;
}

var word = findLongestWord(["The","quick","brown", "fox", "jumped", "over", "the", "lazy", "dog"]);
console.log(word); // result is "jumped"

The array function forEach has been supported since IE9+.

answered Dec 12, 2016 at 21:43

Niels van Reijmersdal's user avatar

0

In ES6 this could be accomplished with a reduce() call in O(n) complexity as opposed to solutions using sort() which is O(nlogn):

const getLongestText = (arr) => arr.reduce(
  (savedText, text) => (text.length > savedText.length ? text : savedText),
  '',
);

console.log(getLongestText(['word', 'even-longer-word', 'long-word']))

answered Jan 27, 2020 at 17:04

Alex Lomia's user avatar

Alex LomiaAlex Lomia

6,59012 gold badges51 silver badges86 bronze badges

6

var arr = [ 'fdgdfgdfg', 'gdfgf', 'gdfgdfhawsdgd', 'gdf', 'gdfhdfhjurvweadsd' ];
arr.sort(function (a, b) { return b.length - a.length })[0];

answered Jun 29, 2011 at 13:35

katspaugh's user avatar

katspaughkatspaugh

17.3k11 gold badges65 silver badges103 bronze badges

0

function max( input ) {
return input.reduce((a, b) => a.length <= b.length ? b : a)
}

answered Nov 25, 2021 at 20:07

modos's user avatar

modosmodos

2001 gold badge4 silver badges10 bronze badges

I was inspired of Jason’s function and made a little improvements to it and got as a result rather fast finder:

function timo_longest(a) {
  var c = 0, d = 0, l = 0, i = a.length;
  if (i) while (i--) {
    d = a[i].length;
    if (d > c) {
      l = i; c = d;
    }
  }
  return a[l];
}
arr=["First", "Second", "Third"];
var longest = timo_longest(arr);

Speed results: http://jsperf.com/longest-string-in-array/7

answered Sep 23, 2012 at 0:52

Timo Kähkönen's user avatar

Timo KähkönenTimo Kähkönen

11.9k8 gold badges71 silver badges112 bronze badges

I provide a functional+recursive approach. See comments to understand how it works:

const input1 = ['a', 'aa', 'aaa']
const input2 = ['asdf', 'qwer', 'zxcv']
const input3 = ['asdfasdf fdasdf a sd f', ' asdfsdf', 'asdfasdfds', 'asdfsdf', 'asdfsdaf']
const input4 = ['ddd', 'dddddddd', 'dddd', 'ddddd', 'ddd', 'dd', 'd', 'd', 'dddddddddddd']

// Outputs which words has the greater length
// greatestWord :: String -> String -> String
const greatestWord = x => y => 
      x.length > y.length ? x : y
      
// Recursively outputs the first longest word in a series
// longestRec :: String -> [String] -> String
const longestRec = longestWord => ([ nextWord, ...words ]) =>
      //                                ^^^^^^^^^^^^
      // Destructuring lets us get the next word, and remaining ones!
      nextWord // <-- If next word is undefined, then it won't recurse.
        ? longestRec (greatestWord (nextWord) (longestWord)) (words) 
        : longestWord


// Outputs the first longest word in a series
// longest :: [String] -> String
const longest = longestRec ('')

const output1 = longest (input1)
const output2 = longest (input2) 
const output3 = longest (input3)
const output4 = longest (input4)

console.log ('output1: ', output1)
console.log ('output2: ', output2)
console.log ('output3: ', output3)
console.log ('output4: ', output4)

answered Oct 25, 2018 at 12:59

Matías Fidemraizer's user avatar

7

I see the shortest solution

function findLong(s){
  return Math.max.apply(null, s.split(' ').map(w => w.length));
}

answered Jan 4, 2017 at 4:44

Giancarlo Ventura's user avatar

2

If your string is already split into an array, you’ll not need the split part.

function findLongestWord(str) {
  str = str.split(' ');
  var longest = 0;

  for(var i = 0; i < str.length; i++) {
     if(str[i].length >= longest) {
       longest = str[i].length;
        } 
     }
  return longest;
}
findLongestWord("The quick brown fox jumped over the lazy dog");

answered Nov 21, 2017 at 3:19

Andy Smith's user avatar

Andy SmithAndy Smith

4184 silver badges9 bronze badges

In case you expect more than one maximum this will work:

_.maxBy(Object.entries(_.groupBy(x, y => y.length)), y => parseInt(y[0]))[1]

It uses lodash and returns an array.

answered Mar 13, 2018 at 18:27

Gismo Ranas's user avatar

Gismo RanasGismo Ranas

5,9833 gold badges27 silver badges39 bronze badges

With ES6 and it support a duplicate string

var allLongestStrings = arrayOfStrings => {
  let maxLng = Math.max(...arrayOfStrings.map( elem => elem.length))
  return arrayOfStrings.filter(elem => elem.length === maxLng)
}

let arrayOfStrings = ["aba", "aa", "ad", "vcd","aba"]
 
console.log(allLongestStrings(arrayOfStrings))

answered Aug 6, 2018 at 20:52

Taha Azzabi's user avatar

Taha AzzabiTaha Azzabi

2,33822 silver badges29 bronze badges

I would do something like this:

function findLongestWord(str) {
   var array = str.split(" ");
   var maxLength=array[0].length;
   for(var i=0; i < array.length; i++ ) {
      if(array[i].length > maxLength) maxLength = array[i].length
   }
 return maxLength;
}

findLongestWord("What if we try a super-long word such as otorhinolaryngology");

answered Dec 26, 2015 at 10:58

Siawash Kasra's user avatar

Modern browsers support a for...of loop. The fastest and shortest way to solve this problem in Chrome, Safari, Edge, and Firefox is also the clearest:

let largest = '';
for (let item of arr) {
  if (item.length > largest.length) largest = item
}

In IE, you can use Array.forEach; that’s still faster and clearer than sorting or reducing the array.

var largest = '';
arr.forEach(function(item) {
  if (item.length > largest.length) largest = item
});

answered Apr 3, 2020 at 6:06

Dan Fabulich's user avatar

Dan FabulichDan Fabulich

36.9k40 gold badges138 silver badges174 bronze badges

If you want to know the INDEX of the longest item:

var longest = arr.reduce(
        (a, b, i) => arr[a].length < b.length ? i : a,
        0
    );

(which can be a one-liner for those that love that stuff…. but it’s split up here for readabilty)

answered Feb 21, 2022 at 21:54

lowcrawler's user avatar

lowcrawlerlowcrawler

6,6118 gold badges36 silver badges72 bronze badges

It’s real simple using java 8 (just check that your array is not empty first or process the .get() specially):

List<String> strings = Arrays.asList(animals);    
String longest = strings.stream().
    max(Comparator.comparingInt(String::length)).get();
int max = longest.length();

OR, if you just need the length:

int max = strings.stream().map(String::length).max(Integer::compareTo).get();

Or, if you prefer a one-liner, it’s:

String longest = Arrays.asList(animals)
     .strings.stream().max(Comparator.comparingInt(String::length)).get();
=AND= 
int max = Arrays.asList(animals)
           .stream().map(String::length).max(Integer::compareTo).get();

Well, okay.. it’s actually two-liner 🙂 Enjoy!

UPDATE:

Instead of Arrays.asList(animals).strings.stream() one could use directly Stream.of(animals)

Напишите функцию f19, которая выводит самую длинную строку maxString из массива d19 в out-19. Я попытался, но не получилось. Как определить эту самую длинную строку?

let d19 = ['Your', 'payment', 'method', 'will', 'automatically', 'be', 'charged', 'in', 'advance', 'every'];
let maxString = d19[0];

function f19() {
    for (let i = 0; i <d19.length;i++)
    if(d19[i]> maxString){
    maxString = d19[i] 
    console.log(maxString)}
}

document.querySelector('.b-19').onclick = f19;

<section>
            <p><b>Task 19.</b></p>
            <p>Напишите фукнцию f19, которая выводит самую длинную строку maxString из массива d19 в out-19.</p>
            <pre>d19 = ['Your','payment','method','will','automatically','be','charged','in','advance','every' ];</pre>
            <button class="button-primary b-19">Task-19</button>
            <div class="out-19"></div>
        </section>

Zyf21

0 / 0 / 0

Регистрация: 26.10.2014

Сообщений: 171

1

Вычисление самой длинной строки в массиве

31.03.2015, 21:31. Показов 4822. Ответов 8

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Нужно разработать метод, в котором с клавиатуры вводится массив из n строк символов. Результат работы метода – печать самой длинной строки.Написал программу, но она выдает ошибку “Индекс находился вне границ массива.”Помогите пожалуйста исправит программу.Заранее благодарю.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
  static string MaxArr(string[] a)
        { int n = a.Length;
        string max = a[1];
        for (int i = 0; i < n; i++)
        {
            if (a[i].Length > a[1].Length)
                max = a[i];
        }
        return max;
 
        }  
     
        static void Main(string[] args)
        {
            Console.WriteLine("Введите количество строк");
            int a = int.Parse(Console.ReadLine());
            string[] M = new string[a];
            for (int i = 1; i <= a; i++)
          {
                M[i] = Console.ReadLine();
           }
 
 
            Console.WriteLine(MaxArr(M));
            Console.ReadLine();
        }



0



programmer403

1 / 1 / 1

Регистрация: 24.09.2013

Сообщений: 25

31.03.2015, 21:40

2

Цитата
Сообщение от Zyf21
Посмотреть сообщение

C#
1
2
3
4
for (int i = 1; i <= a; i++)
 {
M[i] = Console.ReadLine();
}

C#
1
for (int i = 0; i < a; i++)

… первый цикл правильно написал, а вот второй почему-то по другому..



0



0 / 0 / 0

Регистрация: 26.10.2014

Сообщений: 171

31.03.2015, 21:43

 [ТС]

3

programmer403, Скажите пожалуйста,нужно строку написанную вами заменить нашу? Я попробовал, но программа все равно не работает. Я i 0 тоже присваивал, но она все равно не работает.



0



programmer403

1 / 1 / 1

Регистрация: 24.09.2013

Сообщений: 25

31.03.2015, 21:47

4

Добавлено через 2 минуты

Цитата
Сообщение от Zyf21
Посмотреть сообщение

Я i 0 тоже присваивал, но она все равно не работает.

а пробовали

C#
1
 i < a



0



Zyf21

0 / 0 / 0

Регистрация: 26.10.2014

Сообщений: 171

31.03.2015, 21:51

 [ТС]

5

programmer403, пробовал.Вроде не в этом проблема.Проблема в этой строке

C++
1
M[i] = Console.ReadLine();



0



programmer403

1 / 1 / 1

Регистрация: 24.09.2013

Сообщений: 25

31.03.2015, 21:52

6

В этой сроке вы вводите символы в массив с клавиатуры, я проверил ваш код. Работает стабильно!

Для удобства можете добавить

C#
1
2
3
4
5
for (int i = 0; i < a; i++)
{
Console.WriteLine("Введите значение по очереди:");
M[i] = Console.ReadLine();
}



0



0 / 0 / 0

Регистрация: 26.10.2014

Сообщений: 171

31.03.2015, 21:53

 [ТС]

7

programmer403, скиньте пожалуйста код который у вас компилировался сюда.



0



programmer403

1 / 1 / 1

Регистрация: 24.09.2013

Сообщений: 25

31.03.2015, 21:55

8

Лучший ответ Сообщение было отмечено Zyf21 как решение

Решение

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Program
    {
        static string MaxArr(string[] a)
        {
            int n = a.Length;
            string max = a[1];
            for (int i = 0; i < n; i++)
            {
                if (a[i].Length > a[1].Length)
                    max = a[i];
            }
            return max;
 
        }
 
        static void Main(string[] args)
        {
            Console.WriteLine("Введите количество строк");
            int a = int.Parse(Console.ReadLine());
            string[] M = new string[a];
            for (int i = 0; i < a; i++)
            {
                Console.WriteLine("Введите значение по очереди:");
                M[i] = Console.ReadLine();
            }
 
            Console.WriteLine(MaxArr(M));
            Console.ReadLine();
        }
    }



1



0 / 0 / 0

Регистрация: 26.10.2014

Сообщений: 171

31.03.2015, 21:59

 [ТС]

9

programmer403, заработало!Нужно было присвоить ноль и сделать строго меньше а одновременно, а я это делал по отдельности друг от друга. Спасибо вам огромное.



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

31.03.2015, 21:59

9

Самая длинная строка в массиве

Просмотров 1.5к. Обновлено 15 октября 2021

Вводятся строки. Определить самую длинную строку и вывести ее номер на экран. Если самых длинных строк несколько, то вывести номера всех таких строк.

  1. При считывании строк, каждую из них следует поместить в массив.
  2. Предположим, что первая строка самая длинная. Присвоим ее индекс переменной.
  3. Переберем все элементы-строки массива, начиная со второго. Если длина очередной строки больше, чем той, индекс которой записан в переменной (п. 2), то записать в эту переменную индекс текущей строки.
  4. Снова переберем все элементы массива строк. Если длина очередной строки совпадает с длиной той строки, индекс которой хранится в переменной (п. 2), то вывести ее номер на экран.

Pascal

Самая длинная строка паскаль


const N = 5;
var
ss: array[1..N] of string;
i,ind: byte;
begin
for i:=1 to N do begin
write(i,'-я: ');
readln(ss[i]);
end;

ind:=1;
for i:=2 to N do
if length(ss[i]) > length(ss[ind]) then
ind := i;

for i:=1 to N do
if length(ss[i]) = length(ss[ind]) then
write(i, ' ');
writeln;
end.



1-я: this is town
2-я: cat walk
3-я: lamp
4-я: blue lamp!!!
5-я: ok
1 4

Язык Си


#include < stdio.h>
#include < string.h>
#define N 5
main() {
char str[N][30];
int i,ind;
for (i=0; i< N; i++) {
printf("%d-я: ",i+1);
gets(str[i]);
}
ind = 0;
for (i=1; i< N; i++)
if (strlen(str[i]) > strlen(str[ind]))
ind = i;

for (i=0; i< N; i++)
if (strlen(str[i]) == strlen(str[ind]))
printf("%d ",i+1);
printf("n");
}

Python


# Вариант 1

N = 5

a = []
for i in range(N):
print(i+1, end='-я: ')
a.append(input())

ind = 0
for i in range(1, N):
if len(a[i]) > len(a[ind]):
ind = i

for i in range(N):
if len(a[i]) == len(a[ind]):
print(i+1)

# Вариант 2

N = 5

a = [input(str(i + 1) + '-ая: ') for i in range(N)]
max_len = max([len(i) for i in a])
[print(i+1, end=' ') for i in range(N) if len(a[i]) == max_len]

КуМир


алг самая длиная строка
нач
лит таб ss[1:5]
цел i, id
нц для i от 1 до 5
вывод i, "-я: "
ввод ss[i]
кц
id := 1
нц для i от 2 до 5
если длин(ss[i]) > длин(ss[id]) то
id := i
все
кц
нц для i от 1 до 5
если длин(ss[i]) = длин(ss[id]) то
вывод i, " "
все
кц
кон

Basic-256


N = 5
dim s$(N,20)
for i=0 to N-1
print (i+1)+"-я: ";
input s$[i]
next i

ind = 0
for i=1 to N-1
if length(s$[i]) > length(s$[ind]) then ind = i
next i
for i=0 to N-1
if length(s$[i]) = length(s$[ind]) then print i+1
next i

Добавить комментарий