2016-12-16 63 views
0

的我有一对夫妇的ArrayList:改造2周的ArrayList

ArrayList的一个 - > [ “52”, “52”, “52”, “52”, “67”, “67”, ArrayList b - > [“1”,“4”,“5”,“6”,“3”,“4”,“5”,“10”]

]

我想要把它们转化为:在

的ArrayList - > [ “52”, “52”, “67”, “67”]

ArrayList的BT - > [ “1” ,“4 - 6”,“3 - 5”,“1 0“]

我知道如何让b进入bt,但是我无法把头围进去。

Algorith制作b分成BT:

public static void main(String[] args) { 

    ArrayList<String> alist = new ArrayList<String>(); 
    alist.add("1"); 
    alist.add("4"); 
    alist.add("5"); 
    alist.add("6"); 
    alist.add("3"); 
    alist.add("4"); 
    alist.add("5");  
    alist.add("10"); 

    alist = groupByRange(alist); 

} 

static public ArrayList<String> groupByRange(ArrayList<String> alist) { 

    // ArrayList<String> to ArrayList<Integer> 
    ///////////////////////////////////////////////////////// 

    ArrayList<Integer> alist_int = new ArrayList<Integer>(); 
    for (String ident : alist) { 
     alist_int.add(Integer.parseInt(ident)); 
    } 

    // ArrayList<Integer> to int[] 
    ///////////////////////////////////////////////////////// 

    int[] arr = new int[alist_int.size()]; 

    for (int i = 0; i < arr.length; i++) { 
     arr[i] = alist_int.get(i); 
    } 

    // Grouping by range (return ArrayList<String>) 
    ///////////////////////////////////////////////////////// 

    int start, end; 
    end = start = arr[0]; 
    ArrayList<String> alist_res = new ArrayList<String>(); 
    for (int i = 1; i < arr.length; i++) { 
     if (arr[i] == (arr[i - 1] + 1)) { 
      end = arr[i]; 
     } else { 

      if (start == end) { 
       alist_res.add(String.valueOf(start)); 
      } else { 
       alist_res.add(String.valueOf(start) + " - " + String.valueOf(end)); 
      } 
      start = end = arr[i]; 
     } 
    } 

    if (start == end) { 
     alist_res.add(String.valueOf(start)); 
    } else { 
     alist_res.add(String.valueOf(start) + " - " + String.valueOf(end)); 
    } 

    for (String n : alist_res) { 
     System.out.println(n); 
    } 

    return alist_res; 
} 
+5

问题是:为了编写任何代码,首先需要**清晰**关于您的需求。例如:什么规则告诉你(52,52,52,52)应该减少到(52,52)?规则是否说:连续两次相同的数字?或者:减少重复只发生两次?我的意思是:你首先需要**清楚**指定**规则**来进行转换。然后你开始思考“如何”。执行不明确的规则只会导致混乱和痛苦。 – GhostCat

+1

然后请编辑您的问题;不要开始把东西放入评论! – GhostCat

+0

我希望在我的例子中很清楚,但你是对的。我会试着解释:52分与1,4,5和6分;因此我需要(52) - >(1),(52) - >(4-6),(67) - >(3- 5)和(67)→(10) –

回答

0

我有方法,您:

public List<String> groupByValue(List<String> listA) { 

    if (listA.isEmpty()) { 
     return Collections.emptyList(); 
    } 

    final List<String> result = new ArrayList<>(); 
    result.add(listA.get(0)); 

    for (int actualIndex = 1; actualIndex < listA.size(); actualIndex++) { 
     if (actualIndex + 1 < listA.size() - 1 && !listA.get(actualIndex + 1).equals(listA.get(actualIndex))) { 
      result.add(listA.get(actualIndex)); 
      actualIndex++; 
     } 
     if (actualIndex < listA.size() - 1 && !listA.get(actualIndex - 1).equals(listA.get(actualIndex))) { 
      result.add(listA.get(actualIndex)); 
     } 
     if (actualIndex + 1 == listA.size()) { 
      result.add(listA.get(actualIndex)); 
     } 
    } 

    return result; 
} 

这个方法有一个参数,就是您的输入列表中。然后,我们chcek列表,接下来,我们从列表中添加第一个值。接下来我们检查下一个值,最后得到结果,这意味着列表。

+0

它不起作用。该方法应该有2个参数(a和b),因为数组bt的大小等于at。我测试过了,它不会像这样工作。不管怎么说,还是要谢谢你。 –

+0

好吧,也许你可以提供更多关于这种方法应该如何工作的细节?更多关于参数?更多关于规范? – MateuszW90

+0

我不认为这是必要的。问题很简单,但我恐怕没有说清楚。对于那个很抱歉。我会很快编辑主帖子。 –