【问题标题】:Lines of JTextArea to an ArrayList<String>JTextArea 到 ArrayList<String> 的行
【发布时间】:2013-12-24 07:21:08
【问题描述】:

如何将JTextArea 中的每一行转换为ArrayList&lt;String&gt;?也就是说,如何检测 JTextArea 中的换行符?

这是我目前的伪代码实现:

  • 从 JTextArea 获取文本
  • 遍历 JTextArea 中的每个 char 并将其添加到名为 currentWord 的字符串中,直到找到换行符 char //(这样的事情存在吗?)
  • 当循环检测到换行符时,它会将 currentWord 添加到 arrayList 并将 currentWord 设置为空。
  • 循环结束后,将 currrentWord 添加到 ArrayList。

1. 有更简单的方法吗?
2. 这个实现是否可以很好地适应规模? (我猜没有)

【问题讨论】:

  • 您的意思是真正的\n 换行符,还是恰好出现在长字符串中的换行符,因为它比当前视图更宽?前者很简单(split(textvalue,"\n")。后者没有意义,因为拆分会根据视图的宽度而变化。
  • 我会假设前者。当用户用回车换行时,那会注册为 \n 对吗?

标签: java string swing newline jtextarea


【解决方案1】:

首先使用JTextArea#getText 从文本区域获取所有文本。

一旦你有了它,你可以使用String#split,传递"\n"作为值。这将返回 String 在新行上的拆分数组。

如果您想从该行中提取每个单词,您可以再次拆分它,大概在" " 上,这将给您每个单词。

然后您可以使用Arrays.asList 将其转换为List(单词或行)并且(假设您已经创建了一个实例),使用ArrayList#addAll 添加所有Strings到列表中。

如果您只对每个非静音词感兴趣,您可以使用Set 过滤掉重复的词

【讨论】:

  • 我猜他需要像这样非常简单的东西: ArrayList myList = new ArrayList(myJtextArea.getText().split("(\r|\r\n)") );
  • @bluebrain 我从来没有 kW JTextArea 使用 /r,但这并不意味着你不应该考虑它......
  • @MadProgrammer,使用"\\r?\\n" 分割regex 不是更安全吗?
  • @MadProgrammer,再次抱歉,但我认为您在第一次编辑时是对的,因为我不认为 OP 试图将这些单词直接读取为字符串
  • @sage 正如我所说,我从来不知道 JTextArea 使用 \r 作为换行符,并不是说你不应该考虑它,但根据经验,我从来没有使用过它;)
【解决方案2】:

拥抱Strig.split(regex)Arrays.asList 功能的强大功能:

    String s[] = jTextArea1.getText().split("\\r?\\n");
    ArrayList<String>arrList = new ArrayList<>(Arrays.asList(s)) ;
    System.out.println(arrList);

【讨论】:

    【解决方案3】:

    或者,经过反思,我可能会像这样使用您的原始算法

    private static List<String> toList(JTextArea textArea) {
      List<String> al = new ArrayList<String>(); // return list.
      if (textArea != null) {
        String val = textArea.getText(); // the text.
        StringBuilder sb = new StringBuilder(); // for the current word.
        for (char c : val.toCharArray()) {
          if (Character.isWhitespace(c)) { // ANY white space.
            if (sb.length() > 0) { // is there a current word?
              al.add(sb.toString()); // add it to the list.
              sb.setLength(0); // clear the word.
            }
          } else {
            sb.append(c); // NOT white space, add it to current word.
          }
        }
      }
      return al; // return the list.
    }
    

    【讨论】:

    • SrringTokenizer...真的吗?您可以在“”上再次拆分该行,或者甚至使用正则表达式来满足更复杂的要求,只需将结果数组直接添加到 ArrayList,最多需要 3 行......只是说;)
    • @MadProgrammer 我不知道我在想什么!这是OP的算法;还不错。
    【解决方案4】:
    final List<String> lines = Arrays.asList(textArea.split("\n"));
    

    【讨论】:

      【解决方案5】:
      JTextArea txArea = new JTextArea();
      txArea.setText("line1\nline2\nline3");
      String txt = txArea.getText();
      String [] arrayOfLines = txt.split("\n");
      ArrayList<String> linesAsAL = new ArrayList<String>();
      for(String line: arrayOfLines){
          linesAsAL.add(line);
      }
      

      或者在循环中向 ArrayList 添加行更优雅:

      List<String> lines = Arrays.asList(txt.split("\n"));
      

      【讨论】:

        【解决方案6】:
        String line[]=jTextArea1.getText().split("\\n");
        List<String> list=Arrays.asList(line);
        

        【讨论】:

          【解决方案7】:
          scanner s = new scanner(JTextArea.getText());
          while (s.hasNext()) {
             arrayList.add(s.nextLine())
          }
          

          【讨论】:

          • 您能否为您的答案添加一些解释?
          猜你喜欢
          • 2015-07-25
          • 2013-07-29
          • 2014-07-31
          • 1970-01-01
          • 2011-03-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-24
          相关资源
          最近更新 更多