2014-04-02 23 views
-1

我有两个字符串什么是使用Java水平连接文本的好库?

AAA 
AAA 
AAA 

BBB 
BBB 
BBB 

我正在寻找的是一个方法String concatenateHorizontally(String left, String right, String separator, options...)我可以通过这些字符串和接收字符串

AAA BBB 
AAA BBB 
AAA BBB 

我在Vim中(使用块式视觉模式)做了很多事情,但是找不到允许在Java代码中执行它的库。我知道,对于简单的例子来说,这是微不足道的实现,但我希望有人已经以更通用的方式解决了这个问题(例如,通过选项来决定是替换还是附加,插入到固定位置还是行结束,处理不同的换行符,纠正Unicode行为等)。

有人能指点我这样的图书馆水平连接文本?

+1

这个功能似乎很小,我认为很难找到包含这个功能的特定库。我知道让自己的任务看起来很乏味,但是你不是只是有点懒惰吗? :P –

+0

这不是我想要避免的那种单调乏味,而是重新设计了某人可能已经为各种各样的车轮解决的车轮问题。许多文本编辑器提供这种行为,所以我猜测像这样的文本操作捆绑在某个库中。 – kba

回答

0
public class Test 
{ 

    public static void main(String[] args) 
    { 
     System.out.println(concatenateHorizontally("AAA\nBBB\nCCC", "111\n222\n333", "\n", " ")); 
     System.out.println(concatenateHorizontally("AAA\nBBB", "111\n222\n333", "\n", " ")); 
     System.out.println(concatenateHorizontally("AAA\nBBB\nCCC", "111\n222", "\n", " ")); 
    } 

    private static String concatenateHorizontally(final String left, final String right, String br, String concat) 
    { 
     { 

      String[] lefts = left.split(br); 
      String[] rights = right.split(br); 
      int max = Math.max(lefts.length, rights.length); 

      StringBuilder sB = new StringBuilder(); 

      for (int i = 0; i < max; i++) 
      { 

       if (i < lefts.length) 
        sB.append(lefts[i]).append(concat); 

       if (i < rights.length) 
        sB.append(rights[i]); 

       sB.append(br); 
      } 

      return sB.toString(); 
     } 
    } 
} 
+0

谢谢,但是,我不是在寻找算法,而是为了更多功能的图书馆。但是因为这是最好的算法(基本上可以用于不同线数的字符串,虽然它会修剪较短的字符串并且不对齐它们),但我会接受它。感谢您的输入Franz Ebner,user3313050和tassaert.l。 – kba

2

您可以按行返回并交替追加。

由于“轻松杀死”而没有代码示例。

编辑:

实现,因为 “好” 的:

String concatenateHorizontally(final String left, final String right) { 

    String br = "\n"; 

    String[] lefts = left.split(br); 
    String[] rights = right.split(br); 

    if(lefts.length!=rights.length) 
     throw new UnsupportedOperationException("This is where my time becomes money"); 

    StringBuilder sB = new StringBuilder(); 

    for (int i = 0; i < lefts.length; i++) { 

     sB.append(lefts[i]); 
     sB.append(rights[i]); 
     sB.append(br); 
    } 

    return sB.toString(); 
} 
+0

这就是我现在正在做的,是的。如果'left'的行多于'right',你的代码就会中断。如果'right'有多于'left'的行,并不是所有的'right'都被连接在一起。 – kba

+0

StackOverflow是关于'给我一个提示',而不是'为我实现我的接口,包括所有可能性'... –

+0

这就是为什么我要求提供超越微不足道的行为的图书馆暗示。 – kba

0

试试这个:

class m 
    { 
    public static void main(String[] args) 
    { 
    String s="AAA"+"\n"+ 
      "AAA"+"\n"+ 
      "AAA"+"\n"; 
    String s1="BBB"+"\n"+ 
      "BBB"+"\n"+ 
      "BBB"+"\n"; 

    String[] gets=s.split("\n"); 
    String[] gets1=s1.split("\n"); 
    String concate=""; 
    for(int i=0;i<3;i++) 
    { 
    concate=concate+gets[i]+"\t"+gets1[i]+"\n"; 
    } 
    System.out.print(concate);   
}  
} 

输出:

 AAA BBB 
    AAA BBB 
    AAA BBB 
+0

是的,这是我提到的微不足道的实现(这就是我现在所做的)。但是如果我想要扩展行为而不是连接行末尾的行,但是将“右”部分插入到固定位置? – kba

+0

@kba如果您希望将正确的零件放在一个固定的位置,您可能希望使用空格而不是分隔两个零件的选项卡。在这种情况下,计算要添加的空间量(想要的位置减去左侧字符串的长度),并在连接右侧部分之前连接该空间量。 –

+0

@ tassaert.l对,如果两个字符串有不同数量的行,还必须计算空格。 – kba