2012-10-07 73 views
0

我通過arraylist製作了一個map,並試圖交換arraylist的索引(而不是數值)。Java - swap數組列表索引

例如,swapRow(1,2)更改第1行和第2行的位置。 這是第一次運行,但如果再次執行此操作,則會出現錯誤(與swapCol( )的一部分。)

卡在這個問題和需要幫助...

另外,誰能幫我製作swapValue()方法。 更改值很簡單,但我也想移動索引,而不是值。

import java.text.DecimalFormat; 
import java.util.ArrayList; 
public class IntMap { 

    class Data { 
     private int data_; 

     public Data(int data) 
     { 

      setData(data); 
     } 

     public void setData(int data) 
     { 
      if(data<0)data=0; 
      if(data>99)data=99; 

      data_=data; 

     } 

     public int getData() 
     { 
      return data_; 
     } 

    } 


    class Index { 

     private int index_; 

     public Index(int index) 
     { 
      setIndex(index); 
     } 

     public void setIndex(int index) 
     { 
      if(index < 0) index=0; 

      index_=index; 
     } 

     public int getIndex() 
     { 
      return index_; 
     } 

    } 



    private ArrayList<ArrayList<Data>> datas_; 
    private ArrayList<Index> cols_; 
    private ArrayList<Index> rows_; 

    public IntMap(int rowCount, int colCount) 
    { 
     if(rowCount < 0) rowCount = 1; 
     if(rowCount < 0) colCount = 1; 

     cols_ = new ArrayList<Index>(); 
     rows_ = new ArrayList<Index>(); 
     datas_ = new ArrayList<ArrayList<Data>>(); 

     for(int i=0 ; i<rowCount ; ++i) rows_.add(new Index(i)); 
     for(int i=0 ; i<colCount ; ++i) cols_.add(new Index(i)); 

     for(int i=0 ; i< rowCount ; ++i) 
     { 
      ArrayList<Data> temp = new ArrayList<Data>(); 
      datas_.add(temp); 

      for(int j=0 ; j<colCount ; ++j) 
      { 
       temp.add(new Data(0)); 
      } 

     } 

    } 

    public int getValue(int row, int col) 
    { 
     int rIndex = getRowIndex(row); 
     int cIndex = getColIndex(col); 

     return datas_.get(rIndex).get(cIndex).getData(); 
    } 

    public void setValue(int row, int col, int value) 
    { 
     int rIndex = getRowIndex(row); 
     int cIndex = getColIndex(col); 

     datas_.get(rIndex).get(cIndex).setData(value); 

    } 




    public void setRandomValue() 
    { 
     for(int row=0 ; row < datas_.size() ; ++row) 
     { 
      ArrayList<Data> temp = datas_.get(row); 

      for(int col=0; col <temp.size() ; ++col) 
      { 
       Data data = temp.get(col); 

       data.setData((int)(Math.random()*100)); 

      } 
     } 
    } 

    public void log() 
    { 
     DecimalFormat df = new DecimalFormat("00"); 
     for(int row=0; row<rows_.size(); ++row) 
     { 
      for(int col=0; col<cols_.size(); ++col) 
      { 

       int value = getValue(row, col); 
       System.out.print(df.format(value)); 

       if(col<cols_.size()-1) 
        System.out.print(", "); 
      } 

      System.out.println(); 
     } 
     System.out.println(); 
    } 

    private int getColIndex(int col) 
    { 
     if(col <0 || col>=cols_.size()) 
     { 
      System.out.println("[error][IntMap][getColIndex] - col is"+col); 
      return 0; 
     } 

     for(int i =0; i<cols_.size(); ++i) 
     { 
      if(cols_.get(i).getIndex()==col) 
       return i; 
     } 

     System.out.println("[error][IntMap][getColIndex] - unknown error"); 
     return 0; 

    } 

    private int getRowIndex(int row) 
    { 
     if(row <0 || row>=rows_.size()) 
     { 
      System.out.println("[error][IntMap][getRowIndex] - row is"+row); 
      return 0; 
     } 

     for(int i =0; i<rows_.size(); ++i) 
     { 
      if(rows_.get(i).getIndex()==row) 
       return i; 
     } 

     System.out.println("[error][IntMap][getRowIndex] - unknown error"); 
     return 0; 

    } 

    public void swapValue(int a, int b, int c, int d) 
    { 

     // 

    } 

    public void swapCol(int a, int b) 
    { 
     int col1=a; 
     int col2=b; 
     int t=a; 

     cols_.get(col1).setIndex(col2); 
     cols_.get(col2).setIndex(t); 

    } 

    public void swapRow(int a, int b) 
    { 
     int t=a; 

     rows_.get(a).setIndex(b); 
     rows_.get(b).setIndex(t); 

    } 

    public static void main(String[] args) 
    { 
     System.out.println("start!"); 

     IntMap map =new IntMap(3,4); 

     System.out.println("Init map 3x4"); 
     map.log(); 

     System.out.println("random map"); 
     map.setRandomValue(); 
     map.log(); 

     System.out.print("get map[0][1]= "); 
     System.out.println(map.getValue(0,1)); 

     System.out.println("set map[2][1]=50"); 
     map.setValue(2, 1 ,50); 
     map.log(); 

     System.out.println("swap(0,1 <-> 2,1)"); 
     map.swapValue(0,1,2,1); 
     map.log(); 

     System.out.println("swapRow(0 <-> 2)"); 
     map.swapRow(0,2); 
     map.log(); 

     System.out.println("swapRow(1 <-> 2)"); 
     map.swapRow(1,2); 
     map.log(); 

     System.out.println("swapCol(0 <-> 3)"); 
     map.swapCol(0,3); 
     map.log(); 


    } 
} 
+0

你會得到什麼錯誤? – Abubakkar

+0

但是從名字看,它看起來像是在交換數據,而不是索引。 – greatmajestics

回答

1

我想你有困惑rows_ arrayList和您的索引類型的索引。你的swapRow(a,b)應該檢查rows_list並找出元素(Index Object).getIndex = a和b,然後交換兩個Index元素,而不僅僅是你在你的方法中做了什麼。如果您將方法更改爲以下內容,則應該可以工作。你可以做一些錯誤處理,例如發生什麼參數a或b無效。我只是將其設置爲0.

public void swapRow(int a, int b) { 
     int ai = 0, bi = 0; 
     for (final Index i : rows_) { 
      if (i.getIndex() == a) { 
       ai = rows_.indexOf(i); 
      } 
      if (i.getIndex() == b) { 
       bi = rows_.indexOf(i); 
      } 
     } 
     final Index aidx = rows_.get(ai); 
     rows_.set(ai, rows_.get(bi)); 
     rows_.set(bi, aidx); 

    } 

而且,我不知道您確切的要求。但從設計角度來看,可能還有改進的餘地。