[英]Why is my loop not retrieving the last items?
我正在嘗試實現一種方法,以查看項目列表及其數量,而無需重復。 我正在使用ArrayList進行此操作,它將保存我創建的Item類型的對象。 問題出在循環中,我從原始列表的副本中刪除了重復項,因為它沒有顯示列表中的最后兩個項目,而且我也不知道如何解決。 這是代碼。 Item是一個非常簡單的對象,它包含(int標識符,int價格,String名稱)
private ArrayList list;
public void print(ListOfItems storeList)
{
list = storeList.getList();
if ( list.size() == 0)
System.out.println("Sorry! There are no available Items at the store at this moment.");
/** I changed this section
else
{
Object[] originalItems = list.toArray();
ArrayList copy = storeList.getCopy(storeList.getList());
Object[] copyItems = copy.toArray();
System.out.println("Here is a list Of available items in this Store");
System.out.println("Name\tIdentifier\tprice\tQuantity");
//this loop is wrong
for (int i = 0; i < originalItems.length-1; i++)
{
for (int j = i+1; j < originalItems.length; j++)
{
if (originalItems[i].equals(originalItems[j]) && copyItems[j] != null)
{
copy.remove(originalItems[j]);
}
}
}
**/
//Below is the write loop
else
{
Object[] originalItems = list.toArray();
ArrayList copy = new ArrayList(list.size());
for (int i = 0; i < originalItems.length; i++)
{
Item item = (Item) originalItems[i];
if (copy.contains(item) == false)
{
copy.add(item);
}
}
Object[]cop = copy.toArray();
for (int i = 0; i < cop.length; i++)
{
if (cop[i] != null)
{
Item item = (Item) copyItems[i];
System.out.print(item.getName() + "\t");
System.out.print(item.getIdentifier() + "\t\t");
System.out.print(item.getPrice() + "\t");
System.out.print(Methods.getOccurences(list, item));
System.out.println();
}
}
System.out.print("*****************************");
}
}
這是ListOfItems的類
import java.util.ArrayList;
public class ListOfItems
{
int numOfItemsInStore = 50;
private ArrayList list = new ArrayList(numOfItemsInStore);
public ListOfItems()
{
Item item1 = new Item (111, 50, "Item1");
list.add(item1);
Item item2 = new Item (222, 99, "Item2");
list.add(item2);
Item item3 = new Item (333, 20, "Item3");
list.add(item3);
Item item4 = new Item (444, 199, "Item4");
list.add(item4);
Item item5 = new Item (555, 14, "Item5");
list.add(item5);
Item item6 = new Item (666, 40, "Item6");
list.add(item6);
list.add(item6);
list.add(item6);
list.add(item2);
list.add(item3);
list.add(item3);
list.add(item3);
}
public ArrayList getList()
{
return list;
}
public ArrayList getCopy(ArrayList listToCopy)
{
ArrayList copy = new ArrayList(numOfItemsInStore);
if (listToCopy.isEmpty())
System.out.println("This list is Empty");
else
{
Object[] listArray = listToCopy.toArray();
for (int i = 0; i < listArray.length; i++)
{
Item item = (Item) listArray[i];
copy.add(item);
}
}
return copy;
}
}
這是Item類
public class Item
{
private int identifier;
private int price;
private String name;
public Item (int id, int price , String name)
{
this.identifier = id;
this.name = name;
this.price = price;
}
public int getIdentifier()
{
return identifier;
}
public int getPrice()
{
return price;
}
public String getName()
{
return name;
}
}
好吧,首先我建議使用Set刪除重復項...
public void print(ListOfItems storeList)
{
// At this point make sure that "getCopy(ArrayList <Item> listToCopy)" creates a deep copy!
ArrayList <Item> copyOfList = storeList.getCopy(storeList.getList());
// For using this statement make sure that you override "equals" in the "Item" class!
Set <Item> uniqueItems = new HashSet <Item> (copyOfList);
for(Item item : uniqueItems)
{
// Code for usage of each single item
}
}
...這只是解決方案的一種可能方法,但是請確保您覆蓋了 equals
並且您的函數getCopy()
創建了一個深拷貝!
感謝Coderino Javarino ,您當然必須重寫equals
和hashCode
方法而不是 toString
方法!
一種覆蓋equals
方法的選項...
@Override public boolean equals(Object object)
{
if(this == object)
{
return true;
}
if(object == null || getClass() != object.getClass())
{
return false;
}
Item item = (Item) object;
return Objects.equals(this.name, item.name) &&
this.identifier == item.identifier &&
this.price == item.price;
}
這里是創建深層副本的選項...
public ArrayList getCopy(ArrayList <Item> listToCopy)
{
if(null == listToCopy)
{
// Handle this option too
}
ArrayList <Item> copy = new ArrayList(listToCopy.size());
for(Item item : listToCopy)
{
// It is important that your class "Item" contains a copy constructor
copy.add(new Item(item));
}
return copy;
}
根據您的代碼,我想您的最終警察名單中遺漏了項目6和項目3。 因為刪除操作不正確。
在開始for循環中,3個變量的初始狀態為:
外部for循環完成第6輪(i = 5)之后,以上3個變量的狀態:
不幸的是,當i = 6且j = 7時,我們發現“項目6”再次重復,並且復制列表將其刪除。 <-問題在這里。
我們絕對有能力解釋為什么“項目3”以相同的想法丟失。 當i = 10,j = 11時發生。
以及如何解決? 如果仍然要使用2 for循環,則可以實施以下策略:
init copy list is empty
init originalitem as copy of your list
for item in originalItem
isExist = false
for copy list
if item in copy
isExist = true
break
if isExist = false
copy add item
但是,有很多方法可以有效地刪除列表中的重復元素,而不是使用2 for循環策略。
else
{
Object[] originalItems = list.toArray();
ArrayList copy = new ArrayList(list.size());
for (int i = 0; i < originalItems.length; i++)
{
Item item = (Item) originalItems[i];
if (copy.contains(item) == false)
{
copy.add(item);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.