2016-08-04 35 views
0

即使使用本書提供的一些僞代碼作爲提示,本章也介紹瞭如何處理這個問題(本章是關於數組和的ArrayList)。順便說這不是功課,而我是自學。在數組列表中分組相同的數字(Big Java Ex 7.5)

問題

一個運行是相鄰的重複值的序列。寫一個程序 生成一個20個隨機擲骰子的序列,並打印出 值,通過將它們包括在括號中標記運行,如下所示: 1 2(5 5)3 1 2 4 3(2 2 2 2 )3 6(5 5)6 3 1

提示在預訂

設置一個布爾變量inRun爲false。

對於在陣列列表中的每個有效索引i如果inRun

如果值[i]是從先前值打印不同)inRun =假否則

如果值[i]是相同的以下 值打印(inRun =真打印值。[I]

什麼我不明白是怎樣的暗示是真正幫助假如我們有多個號碼,如2 2 2 2慣於這只是像做(2 2) 2 2

繼承人什麼,我想到目前爲止

import java.util.ArrayList; 
import java.util.Random; 
class seq 
{ 
    private ArrayList<Integer> nums; 
    private Random randNum; 
    private boolean inRun; 
    public seq() 
    { 
     nums = new ArrayList<Integer>(); 
     randNum = new Random(); 
     inRun = false; 
    } 

    public void addToArrList() 
    { 
     for(int i = 0; i < 20 ; i++) 
     { 
      int addThisNum = randNum.nextInt(20)+1; 
      nums.add(addThisNum); 
     } 
    } 

    public void checkSides() 
    { 
     int count = 0; 
     for(int i = 0 ; i < nums.size(); i++) 
     { 
      if(nums.get(i) != nums.get(i-1)) 
      { 
       inRun = false; 
      } 
      if(nums.get(i) == nums.get(i+1)) 
      { 
       inRun = true; 
      } 
     } 
    } 

    public String toString() 
    { 
     String output = "Array is:"; 
     if (output.) 
    } 
} 

另一種嘗試

import java.util.Random; 
import java.util.ArrayList; 
class Seq 
{ 
    private ArrayList<Integer> nums; 
    private Random randNum; 
    public Seq() 
    { 
     nums = new ArrayList<Integer>(); 
     randNum = new Random(); 
    } 
    public void fillArrList() 
    { 
     for (int i = 0 ; i < 20 ; i++) 
     { 
      int thisRandNum = randNum.nextInt(20)+1; 
      nums.add(thisRandNum); 
     } 
    } 

    public String toString() { 
     StringBuilder result = new StringBuilder(); 
     boolean inRun = false; 
     for (int i = 0; i < nums.size(); i++) { 
      if (i < nums.size() - 1 && nums.get(i).equals(nums.get(i + 1))) { 
       if (!inRun) { 
        result.append("("); 
       } 
       result.append(nums.get(i)); 
       inRun = true; 

      } else { 
       result.append(nums.get(i)); 
       if (inRun) { 
        result.append(")"); 
       } 
       inRun = false; 

      } 
     } 
     return result.toString(); 
    } 
} 

public class Sequence{ 
    public static void main(String [] args) 
    { 
     Seq seqObj = new Seq(); 
     seqObj.fillArrList(); 
     System.out.println(seqObj.toString()); 
    } 
} 

輸出

85641520612614320473181113612 

201362181920141020(1919)514920162914 

ETC

+0

這應該一直運行到最後一個值,因爲沒有'nums.get(20)'(數組和列表從索引0開始),所以最後一個值將超出界限。當然,這假定你正在添加/打印括號(在你顯示的代碼中沒有發生)。 –

+0

是的,這只是我提出的想法。我只是想知道如何放置括號,我是否需要以某種方式將它們插入到數組列表中? –

回答

2

我認爲他們的意思是這樣的:

@Override 
public String toString() { 
    StringBuilder result = new StringBuilder(); 
    boolean inRun = false; 
    for (int i = 0; i < nums.size(); i++) { 
     if (i < nums.size() - 1 && nums.get(i).equals(nums.get(i + 1))) { 
      if (!inRun) { 
       result.append("("); 
      } 
      result.append(nums.get(i)); 
      inRun = true; 

     } else { 
      result.append(nums.get(i)); 
      if (inRun) { 
       result.append(")"); 
      } 
      inRun = false; 

     } 
    } 
    return result.toString(); 
} 

你也可能要1和6之間,即,生成隨機量

int addThisNum = randNum.nextInt(6) +1; 
+0

我一直在這樣做,但由於某種原因,它始終都沒有工作,例如在一次運行中我得到了85641520612614320473181113612 –

+0

您是否改變了隨機發電? 當它仍然生成最多20個數字時,例如可能111是一個11,然後是1.當我以一位數字輸入您的數字時,我會得到預期的輸出8564152061261432047318(111)3612 – garnulf

+0

啊。謝謝!。本書後面的問題說明了這個問題,並且只在最長的標記周圍加上括號,例如1122333(4444),因爲那些是四個連續的四個。你能給我一個提示嗎? –

1

這裏randNum.nextInt(20)+1;您正在生成從0到20需要生成這就需要只包含一個數字的隨機值的隨機值,

在for循環i相零在第一狀態開始

調用nums.get(i-1)這是不正確爲i = 0,因此I-1將是-1

有更多的邏輯問題,你可以從代碼檢查它們上面

package com.run; 

import java.util.ArrayList; 
import java.util.Random; 

public class Run { 
    private ArrayList<Integer> nums; 
    private Random randNum; 
    private boolean inRun; 
    private StringBuffer sb; 
    public Run(){ 
     nums = new ArrayList<Integer>(); 
     randNum = new Random(); 
     inRun = false; 
     sb = new StringBuffer(); 
    } 
    public static void main(String[] args) { 
     Run run = new Run(); 
     run.addToArrList(); 
     run.checkSides(); 
    } 
    public void addToArrList() 
    { 
     for(int i = 0; i < 20 ; i++) 
     { 
      int addThisNum = randNum.nextInt(9)+1; 
      nums.add(addThisNum); 
     } 
    } 

    public void checkSides() 
    { 
     int count = 0; 
     for(int i = 1 ; i < nums.size(); i++) 
     { 
      if(nums.get(i) != nums.get(i-1)) 
      { 
       if(inRun) 
        sb.append(")"); 
       inRun = false; 
      } 
      else 
      { 
       if(!inRun){ 
        System.out.println(nums.get(i)); 
        inRun = true; 
        sb.replace(sb.length()-1, sb.length(), "(" + nums.get(i-1)); 
       } 
      } 
      sb.append(String.valueOf(nums.get(i))); 
     } 
     System.out.println(sb.toString()); 
    } 
} 
+0

啊,完全忘記了arraylist有一個替換方法。謝謝!! –

+0

注意它不是數組列表,我用它來替換它是一個stringbuffer –

+0

我明白了。你可以看看我的新嘗試,看看我搞亂了嗎? –