检查列表是否包含相同的数据

时间:2013-03-27 17:32:36

标签: java arrays list data-structures

我有一个对象数组列表....每个数组中都有4个对象。

我需要读取完整列表并将所有在元素[1]中具有相同值的数组放在单独的列表中。

怎么做?

例如,我有一个列表'data'

,其中包含第n个对象数组,如

array[0]
array[1]
array[2]
⋮ 
array[n]

每个数组都有4个值

array[0] has 0,23,BD,100
array[1] has 1,23,FG,200
array[2] has 3,34,GH,400
array[3] has 8,87,UJ,600
⋮ 
array[n] has 98,23,KM,9000

现在我需要将array[0], array[1] and array[n]放在同一个list(List1)中,因为它们都具有相同的值'element 2' i-e '23'

array[2]时单独list(List2)array[3]单独list(List3),因为没有其他数组具有相似的'元素2'。

所有数组都是对象类型。

1 个答案:

答案 0 :(得分:1)

我认为您正在获取这样的值,因为您从一个或多个表中选择了一个属性子集。实际上,您最终得到了Object类型的数组列表。这是因为每个属性都有自己的类型,因此可以处理这种未定义情况的常见超类型是Object本身。

您可以采取两种方法。一个将需要增强与数据库的交互,另一个将使用额外的处理来替换此查询调优,以准备刚刚检索的数据。

选项1:进一步参数化您的查询

在查询中添加另一个条件,您可以在其中定义第二个属性(element 2,因为您已命名)。然后查询将具有以下额外条件:

AND element2 = :element2

这样,您可以在查询数据时确定element 2,直接获取相关数据的每个子集。这种方法需要先前了解您要检索的值以及与值一样多的查询。

可以使用简单查询检索值:

SELECT DISTINCT(element2) FROM <YOUR_TABLES_HERE>

每次执行查询时,您仍然会获得List Object[],但这次,element 2的值都相同。

选项2:处理刚刚获得的数据

如果更改您的查询不是一个选项(或者由于任何原因,没有一种简单的方法可以识别element 2可以采用的不同值),您将必须处理刚从数据库中获取的原始数据。

我建议您将Map与某些List混合使用。假设element 2位于数组的索引1下,您必须遍历该列表,检查该值并将其添加到地图中:

Map<Long, List<Object[]>> queriedResultsMap = new HashMap<Long,List<Object[]>>();
//Iterate over the obtaines database values
for(Object[] currentArray : yourListOfObject) {
    if(!queriedResultsMap.containsKey(currentArray[1])) {
        //No element with that value for "element 2" is on the map yet,
        //so a new container (List) is created.
        queriedResultsMap.put(currentArray[1],new ArrayList<Object[]>());
    }
    //Adds the element to the associated list.
    queriedResultsMap.get(currentArray[1]).add(currentArray);
}

这段简单的代码迭代你当前的数组列表,并将它们中的每一个添加到与element 2的valye关联的列表中,这是映射的关键。在此映射中,键是element 2的值,关联的值是List,其中包含为element 2设置了相应值的所有已找到的注册表。

if语句每次遇到element 2的新值时都会创建一个新列表,并将其与该值相关联。

最后,要使用这些数据,您只需执行以下操作:

queriedResultsMap.get(element2Value);

其中element2Value包含您要获取结果的值。地图返回的列表包含具有特定值element 2的所有结果。如果未返回任何列表(get方法返回null),则表示您刚刚运行的查询未返回element 2的值的结果。

地图允许element 2的每个找到值之间的直接关联,并且还让您直接了解所有获得的值,同时让您有机会立即检查是否检索到特定值。要准确了解element 2的哪些值,只需获取地图的keySet,并了解是否检索到给定值,请使用containsKey的{​​{1}}方法。< / p>

使用最适合您的方法。