1

I have an Iterable<MyRecord> records . I iterate over the records like below and add it to a LinkedList as shown below.

for (MyRecord record: records){
    sortedList.addLast(record);
}

My iterable has 3 records, all with different values. But in the end although sortedList contains 3 records, ALL THREE ARE THE SAME!!!. How come?

When I printed out the memory location, it's the same for all 3. What am I doing wrong?


I am trying to copy the sheet1 range data to sheet2 range but,nothing copied

I am trying to copy the sheet1 range data to sheet2 range but nothing gets copied. This is the full code which I was trying to achieve something but got stuck in the basic place. Please help

Edit: I tried the Macro just now and the same thing happened with this code. Please see the snapshot where you can see that Snap 1 contains source data and also selected but does not get copied to Snap 2. However the ranges are selected there.

  Sub copy()
      Range("A1:J4").Select
      Selection.copy
      Sheets("Sheet2").Select
      ActiveSheet.Paste
      Application.CutCopyMode = False
      ActiveWorkbook.Save
  End Sub

enter image description here

enter image description here

UpDate

Style-1

     Option Explicit


     Dim objSheet1,objSheet2,TotalRows,TotalcolCopy,strPathExcel1

     Dim oXls  : Set oXls = CreateObject("Excel.Application")
     Dim aData ': aData = oWb.Worksheets(1).Range("$A2:$C10")
     Dim dicP  : Set dicP = CreateObject("Scripting.Dictionary")

     strPathExcel1 = "D:\WIPData\AravoMacro\Finalscripts\GE_Wing_To_Wing_Report.xlsx"
     oXls.Workbooks.open strPathExcel1

     Set objSheet1 = oXls.ActiveWorkbook.Worksheets(1)
     Set objSheet2 = oXls.ActiveWorkbook.Worksheets(2)


     TotalRows=oXls.Application.WorksheetFunction.CountA(objSheet1.Columns(1)) - 3
     TotalcolCopy=oXls.Application.WorksheetFunction.Match("Parent Business Process ID", objSheet1.Rows(3), 0)

   objSheet1.Range(objSheet1.Cells(4,1),objSheet1.Cells(TotalRows,TotalcolCopy)).Copy(objSheet2.Range("A1"))

    '=======================
     oXls.ActiveWorkbook.SaveAs strPathExcel1
     oXls.Workbooks.close
     oXls.Application.Quit
    '======================

Style-2

  Option Explicit


  Dim objSheet1,objSheet2,TotalRows,TotalcolCopy,strPathExcel1
  Dim oFS   : Set oFS  = CreateObject("Scripting.FileSystemObject")
  Dim oXls  : Set oXls = CreateObject("Excel.Application")
  Dim aData ': aData    = oWb.Worksheets(1).Range("$A2:$C10")
  Dim dicP  : Set dicP = CreateObject("Scripting.Dictionary")

  oXls.Workbooks.Open(oFs.GetAbsolutePathName("Test.xlsx"))
  Set objSheet1 = oXls.ActiveWorkbook.Worksheets(1)
  Set objSheet2 = oXls.ActiveWorkbook.Worksheets(2)


  TotalRows=oXls.Application.WorksheetFunction.CountA(objSheet1.Columns(1)) - 3
  TotalcolCopy=oXls.Application.WorksheetFunction.Match("Parent Business Process ID", objSheet1.Rows(3), 0)

  objSheet1.Range(objSheet1.Cells(4,1),objSheet1.Cells(TotalRows,TotalcolCopy)).Copy(objSheet2.Range("A1"))

  '=======================
  oXls.ActiveWorkbook.SaveAs "Test.xlsx"
  oXls.Workbooks.close
  oXls.Application.Quit
  '======================

Could you people tell me what differences between Style-1 and Style-2.Because in Style-1 all the copied data get saved,which is not the case in Style-2. This design issue mainly the overall problem i was facing from morning.

In what way Style-2 is not perfect?

4

4 に答える 4

3

実際、あなたのコメントは、これがうまくいかない理由への欠落したリンクを明らかにしています。これを Hadoop マッパーまたはリデューサーで使用しています。Hadoop の秘訣は、取得しているオブジェクトを再利用することで、ガベージ コレクターを簡単に処理できるようにすることです。したがって、ソース iterable (s) 内の各オブジェクトのコピーMyRecordを作成し、それらを LinkedList に追加する必要があります。

于 2012-12-20T08:02:46.970 に答える
1

あなたの質問は明確で、コードもそうです(コメントを読んだ後も)。これは役に立たないかもしれませんが、追加する前に、次のような含むチェックを行うことができるかもしれません:if (sortedList.contains(record)) sortedList.add...

私はこれが本当に役に立たないかもしれないことを認めます(また、 を使用してリスト内の要素の存在をチェックするだけかもしれないので、ボンネットの下の要素のメモリ位置のチェックが含まれているかどうかもわかりませんequals)。

于 2012-12-20T07:58:09.380 に答える
1

sortedList に同じレコード (元のレコードの最後の要素) が含まれている場合、反復子が tmp 参照を再利用する可能性があります。「レコード」の実装を確認する必要があります。

于 2012-12-20T07:51:23.133 に答える
0

リストにアイテムを追加するときは、チェックを入れます:

if(sortedList.contains(record))
{
  System.out.println("Record is already available "+record);
}
else
{
 sortedList.addLast(record);
}

問題が同じレコードによるものなのか、それとも別のものによるものなのかを知ることができます。

于 2012-12-20T08:47:41.033 に答える