首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >先得到几个字的字符串,以省道

先得到几个字的字符串,以省道
EN

Stack Overflow用户
提问于 2020-07-21 08:14:43
回答 6查看 12.4K关注 0票数 13

如何从长String中获取头几个单词(摘录)。我有一个大故事类型字符串,需要在屏幕上显示前5-10个单词,并保留在下一个屏幕上显示。那么有什么办法可以做到。我找了很多东西,但没能解决这个问题。为了得到我们使用的第一个字母

代码语言:javascript
复制
String sentence = "My single Sentence";
sentence[0] //M

同样的,我也需要说几句话。例:

代码语言:javascript
复制
String bigSentence ='''
Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book
''';
//code to get the excerpt()

//predicted output=> Lorem Ipsum is simply dummy text...
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2020-07-21 08:18:40

您可以像这样在子串上使用String方法。

代码语言:javascript
复制
String myString = 'abcdefghijklmnopqrstuvwxyz';
String smallString = myString.substring(0,5); //<-- this string will be abcde

对于一个特定的用例,如果您想要最多30个字符,不管结果字符串中的单词数如何,那么您可以编写这样一个函数。

代码语言:javascript
复制
String smallSentence(String bigSentence){
  if(bigSentence.length > 30){
    return bigSentence.substring(0,30) + '...';
  }
  else{
    return bigSentence;
  }
}

如果要求是专门获取前几个单词,让我们说前6个单词,不管结果字符串的长度,那么您可以编写如下所示的函数。我们还需要在indexOf上使用String方法。

代码语言:javascript
复制
String firstFewWords(String bigSentence){
  
  int startIndex = 0, indexOfSpace;
  
  for(int i = 0; i < 6; i++){
    indexOfSpace = bigSentence.indexOf(' ', startIndex);
    if(indexOfSpace == -1){     //-1 is when character is not found
      return bigSentence;
    }
    startIndex = indexOfSpace + 1;
  }
  
  return bigSentence.substring(0, indexOfSpace) + '...';
}

创建extension -附加编辑

您可以在extension上创建一个String,如下所示

代码语言:javascript
复制
extension PowerString on String {

  String smallSentence() {
    if (this.length > 30) {
      return this.substring(0, 30) + '...';
    } else {
      return this;
    }
  }

  String firstFewWords() {
    int startIndex = 0, indexOfSpace;

    for (int i = 0; i < 6; i++) {
      indexOfSpace = this.indexOf(' ', startIndex);
      if (indexOfSpace == -1) {
        //-1 is when character is not found
        return this;
      }
      startIndex = indexOfSpace + 1;
    }

    return this.substring(0, indexOfSpace) + '...';
  }
}

像这样使用它

代码语言:javascript
复制
  String bigText = 'very big text';
  
  print(bigText.smallSentence());
  print(bigText.firstFewWords());
票数 20
EN

Stack Overflow用户

发布于 2020-07-21 08:45:49

A.简单的方法

要拆分字符串,我们需要有几个步骤:

  1. 把它变成列表
  2. 做新的更小的列表
  3. 将其转换回字符串

第一步

要将字符串转换为列表,我们可以使用以下方法

代码语言:javascript
复制
String bigSentence = 'Lorem Ipsum is'
bigSentence.split(" ")
// ["Lorem", "Ipsum", "is"]

第二步

做新的更小的列表,例如得到前两个单词,

我们使用子表

代码语言:javascript
复制
List<String> splitted = ["Lorem", "Ipsum", "is"]
splitted.sublist(0, 2)
// ["Lorem", "Ipsum"]

第三步

将其转换回字符串

代码语言:javascript
复制
List<String> smaller = ["Lorem", "Ipsum"]
smaller.join(" ")
// "Lorem Ipsum"

全功能代码

最后,我们可以将其简化为single line of code

代码语言:javascript
复制
String getFirstWords(String sentence, int wordCounts) {
  return sentence.split(" ").sublist(0, wordCounts).join(" ");
}

String bigSentence = '''
Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book
''';

main() {
  String result = getFirstWords(bigSentence, 2);
  print(result); // Lorem Ipsum


  String resultDots = getFirstWords(bigSentence, 2) + " ...";
  print(resultDots); // Lorem Ipsum ...


}

备选方案

实际上,还有另一种方法可以实现新的更小的列表,如步骤2所建议的那样

使用take

代码语言:javascript
复制
List<String> splitted = ["Lorem", "Ipsum", "is"]
splitted.take(2)
// ["Lorem", "Ipsum"]

B.艰难的道路

正如scrimau所建议的那样,上面的第一种方法可能会经历性能命中的,因为它的低效率首先分裂了数千个单词,以便得到几个单词。

我刚刚了解到Dart符文,在这种情况下这可能会对我们有所帮助。

要迭代字符串,首先我们需要将其转换为Runes。如前所述,Runes 可迭代

我们需要有几个步骤:

1.验证查找计数

代码语言:javascript
复制
  if (findCount < 1) {
    return '';
  }

2.将分隔符和句子转换为符文

代码语言:javascript
复制
  Runes spaceRunes = Runes(wordSeparator);
  Runes sentenceRunes = Runes(sentence);

3.准备最后的弦

代码语言:javascript
复制
  String finalString = "";

4.迭代符文

最重要的部分在这里,,对于你的情况,我们需要找到空间‘’

所以,稍后如果我们已经找到足够的空间,我们只需返回Final String

如果我们没有找到足够的空间,那么迭代更多,然后追加Final String

请注意,这里我们使用.single,因此单词分隔符必须仅为单个字符。

代码语言:javascript
复制
  for (int letter in sentenceRunes) {
    // <------ SPACE Character IS FOUND----->
    if (letter == spaceRunes.single) {
      findCount -= 1;
      if (findCount < 1) {
        return finalString;
      }
    }
    // <------ NON-SPACE Character IS FOUND ----->
    finalString += String.fromCharCode(letter);
  }

全功能代码

代码语言:javascript
复制
String bigSentence = '''
Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book
''';

String getFirstWordsFast(String sentence, String wordSeparator, int findCount) {
  if (findCount < 1) {
    return '';
  }

  Runes spaceRunes = Runes(wordSeparator);
  Runes sentenceRunes = Runes(sentence);
  String finalString = "";

  for (int letter in sentenceRunes) {
    if (letter == spaceRunes.single) {
      findCount -= 1;
      if (findCount < 1) {
        return finalString;
      }
    }
    finalString += String.fromCharCode(letter);
  }
  return finalString;
}

main() {
  String shorterString = getFirstWordsFast(bigSentence, " ", 5);
  print(shorterString); // Lorem Ipsum is simply dummy
}
票数 6
EN

Stack Overflow用户

发布于 2020-07-21 08:26:20

代码语言:javascript
复制
void main() {
  String bigSentence =
      "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book";
  
  /// if length of string is greater than 6 words then append dots
  bool appendDots = false;
  
  
  /// this will split string into words
  List<String> tempList = bigSentence.split(" ");

  int start = 0;
  int end = tempList.length;
  /// extract first 6 words
  if (end > 6) {
    end = 6;
    appendDots = true;
  }
  /// sublist of tempList
  final selectedWords = tempList.sublist(start, end);
  /// join the list with space
  String output = selectedWords.join(" ");

   if(appendDots){
     output += "....";
   }
  
  print(output);
}

编辑:另一个解决方案

代码语言:javascript
复制
Text('Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry\'s standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book',
   maxLines : 1,
   overflow: TextOverflow.ellipsis, 
),
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63010255

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档