【问题标题】:Zipping a list of strings in java在java中压缩字符串列表
【发布时间】:2013-11-26 09:30:18
【问题描述】:

压缩与此类似的字符串列表的最简单/最快的方法是什么:

john,barry,stewart,josh,30,45,23,56

我希望订单是

john,30,barry,45,stewart,23,josh,56

我知道这听起来像家庭作业,但实际列表用于某些 selenium 代码并存储 url 和页面上单选按钮的选项,但我认为上面的示例更易于阅读。

【问题讨论】:

  • 这种排序行为的规则是什么?这个顺序看起来完全是任意的。
  • 您能描述一下这种排序背后的想法吗?为什么john 出现在30 之前,而后者又出现在barry 之前?这看起来更像是将两个列表压缩为一个。
  • 也许我应该使用真正的 selenium 示例:P 我在一个方法中返回的列表有一堆从页面获取的 URL,然后在我转到这些 URL 并存储的方法中进一步true 或 false 取决于是否单击了单选按钮。然后我有另一种方法可以将所有内容设置回测试前的状态,这样如果我的列表是有序的会更容易,所以我会有一个带有列表中下一个单选按钮值的 url
  • 我仍然不明白排序标准是什么...在尝试询问其他人之前先尝试了解您的问题,如果您比重复示例理解得更好,请改写问题....如果我看一下,它甚至看起来不像是排序,而不仅仅是用一个字符串、一个数字按照它们各自的组出现的顺序重新排列。

标签: java list


【解决方案1】:

我会做类似的事情:

String[] parts = input.split(",");
int halfLength = parts.length / 2;
for (int i = 0; i < halfLength; i++) {
    String name = parts[i];
    String age = parts[i + halfLength];
    // Store them in whatever structure you want here
}

【讨论】:

  • +1 表示最简单的想法......当我看到你的想法时,我的想法是一样的,假设这是提问者打算做的,在此之后没有必要写另一个答案。
  • 谢谢,这是我添加的解决方案。
【解决方案2】:

您需要的是像函数式语言中的zip 函数。

Functional java 可以帮到你。

相关:Is there an accepted Java equivalent to Python's zip()?

【讨论】:

    【解决方案3】:

    您的问题听起来像是您需要代码来修复不良设计。因此,我会退后一步,问这个问题列表如何

    john,barry,stewart,josh,30,45,23,56
    

    在您显然需要时创建:

    (john, 30), (barry, 45), (stewart, 23), (josh, 56)
    

    (将(x,y) 符号替换为您喜欢的元组类型。)

    【讨论】:

      【解决方案4】:

      这里你需要做一些手动代码。

      首先将所有的字符串和整数分别分散,得到两个列表。

      然后只需迭代一个列表并将这两个列表添加到一个最终列表中,如第一个字符串和

      然后是整数。

      【讨论】:

        【解决方案5】:

        看起来像两个列表

        先生成两个列表,新建一个结果列表

        Pseudocode :
        
        list = Arrays.AsList(string.split("\\s+"))
        
        list1 = list.sublist(0, list.size() /2 );
        list2 = list.sublist(list.size() /2 +1 , list.size());
        
        for(int i = 0;i<list1.size() ; i++ ) {
           resultlist.add(list1.get(i);
           resultlist.add(list2.get(i);
        }
        return resultlist
        

        【讨论】:

          【解决方案6】:

          试试这个方法: 1.首先对其进行排序-数字将覆盖列表的一半并命名列表的一半。 2. 创建两个长度为一半的数组:sArr1 和 sArr2。将数字存储在 sArr1 中,将名称存储在 sArr2 中。 3. 通过将两个数组中的数字和名称交替放入原始数组来合并它们。

          import java.util.Arrays;
          
          
          public class SortMix {
              public static void main(String[] args) {
                  String sArr[] = {"john","barry","stewart","josh","30","45","23","56"};
                  Arrays.sort(sArr);
                  display(sArr);
          
                  String sArr1[] = new String[sArr.length/2];
                  for(int i=0;i<sArr.length/2;i++) 
                      sArr1[i] = sArr[i];
                  display(sArr1);
          
                  String sArr2[] = new String[sArr.length/2];
                  for(int i=0;i<sArr.length/2;i++)
                      sArr2[i] = sArr[i+sArr.length/2];
                  display(sArr2);
          
                  int k=0;
                  int l=0;
                  for(int i=0;i<sArr.length;i++) {
                      if(i%2==0){ 
                          sArr[i]=sArr1[k];
                          k++;    
                      } else {
                          sArr[i]=sArr2[l];
                          l++;
                      }
                  }
                  display(sArr);
              }
          
              public static void display(String[] sArr) {
                  for(int i=0;i<sArr.length;i++) 
                      System.out.print(sArr[i] + " ");
                  System.out.println();
              }
          }
          

          输出将是:

          23 30 45 56 barry john josh stewart 
          23 30 45 56 
          barry john josh stewart 
          23 barry 30 john 45 josh 56 stewart
          

          【讨论】:

            【解决方案7】:

            zip的通用版:

            @SafeVarargs
            public static <T> ArrayList<T> zip(Iterable<T>  ...iterables) {
                ArrayList<Iterator<T>> is = new ArrayList<>(iterables.length);
                for (int i=0; i<iterables.length; i++) {
                    is.add(iterables[i].iterator());
                }
                ArrayList<T> al = new ArrayList<>();
                while (is.get(0).hasNext()) {
                    for (int i=0; i<is.size(); i++) {
                        // FIXME: could check for shorter-than-expected sublists here
                        al.add(is.get(i).next());
                    }
                }
                return al;
            }
            

            可以如下测试/调用:

            public static void main(String[] args) {
                List<String> parts = 
                        Arrays.asList("john,barry,stewart,josh,30,45,23,56".split(","));
                List<String> names = parts.subList(0, parts.size()/2);
                List<String> numbers = parts.subList(parts.size()/2, parts.size());
                System.err.println(zip(names, numbers));
            }
            

            【讨论】:

              【解决方案8】:

              您似乎只是想将数字和字母数字交错。我只是扫描列表以找到第一个数字的索引,而不是创建一个新列表并获取第一个 alpha 和第一个数字并将它们添加到新列表中,然后是第二个 alpha 和第二个数字。这不是排序,O(n)也是如此

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2021-04-13
                • 1970-01-01
                • 2012-05-25
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-04-07
                相关资源
                最近更新 更多