急:比较两组数据~~~一组来自excel,一组来自一个List<obj>,数据量excel和list各有1000多~~~

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了急:比较两组数据~~~一组来自excel,一组来自一个List<obj>,数据量excel和list各有1000多~~~相关的知识,希望对你有一定的参考价值。

RT~~~

list的泛型是个实体类~~~~分别对比实体类中的单据号,重量,体积,数量这4个元素的值

如果用for循环来遍历的话…………循环次数多的吓人……所以求教高手有啥优秀的办法没?
有思路也可以~~~

参考技术A 好像不难吧,把excel的数值取出来,包装成实体类,实体类写重载下equeal方法,4个属性相等就返回true,然后你比较就行了,如果是每个都要比较到的话那就必须是1000*1000次啊,如果不是没个都比较到的话你可以放到一个map中,key=单据号,这样取出list中的一个实体然后取map中,有的话比较,没有就不比了,其实也就是查找方法被API封装了,你当然也可以自己实现什么二分查找法,这个那个查找法的,程序我难的写,不懂在问吧 参考技术B 这个不多的。。。for(int i = 0; i<exceldata.length;i++) for (int j=0;j<listdata.length;j++)
if(exceldata.get(i).ID.equals(...)..)
Do your work;


代码上面并不复杂的。
如果是算法上要优化的话,比较难。追问

这样只能判断 exceldata中的某个ID在listdata中存在或者不存在;
我还需要判断listdata中的某个ID在exceldata中是否存在;
如果这样的话~~~上面判断要再重复一遍吧?

追答

//这样就可以比较拿到所有的相同ID的数据
for(int i = 0; i<exceldata.length;i++)
for (int j=0;j<listdata.length;j++)

if(exceldata.get(i).ID.equals(listdata.get(i).ID))
System.out.print(exceldata.get(i).ID)


本回答被提问者采纳
参考技术C 不是很明白你的意思
1000多条记录, 就比较1000多资, 判断也不多吧?
参考技术D .net吗?用linq不错的,只是说白了,归根到底还是循环遍历. 第5个回答  2011-12-28 Excel的数据同样存入 List容器 两个List用Linq操作

根据来自不同对象数组的属性和值过滤对象数组

【中文标题】根据来自不同对象数组的属性和值过滤对象数组【英文标题】:Filter an array of objects based on a property and value from a different array of objects 【发布时间】:2020-01-10 16:44:23 【问题描述】:

我有两组数组,一组用于表的标题(列),另一组用于表的行。

const headers = [
  
    text: 'Dessert (100g serving)',
    align: 'left',
    sortable: false,
    value: 'name',
    visible: true
  ,
   text: 'Calories', value: 'calories', visible: true ,
   text: 'Fat (g)', value: 'fat', visible: true ,
   text: 'Carbs (g)', value: 'carbs', visible: true ,
   text: 'Protein (g)', value: 'protein', visible: true ,
   text: 'Iron (%)', value: 'iron', visible: true 
]

const desserts = [
  
    name: 'Frozen Yogurt',
    calories: 159,
    fat: 6.0,
    carbs: 24,
    protein: 4.0,
    iron: '1%'
  ,
  
    name: 'Ice cream sandwich',
    calories: 237,
    fat: 9.0,
    carbs: 37,
    protein: 4.3,
    iron: '1%'
  ,
  
    name: 'Eclair',
    calories: 262,
    fat: 16.0,
    carbs: 23,
    protein: 6.0,
    iron: '7%'
  ,
  
    name: 'Cupcake',
    calories: 305,
    fat: 3.7,
    carbs: 67,
    protein: 4.3,
    iron: '8%'
  
]

我想要实现的是让用户能够决定他们希望在表格中查看哪些数据列。

我使用的是 Vue.js,所以我尝试设置一组复选框,每个复选框都是 v-bind 作为 headers 集合的标题。

我正在使用以下方法进行此操作:

computed: 
  filteredHeaders () 
    return this.headers.filter(header => header.visible)
  

这按预期工作,糟糕!表格列标题会根据复选框选择的列而变化。

我遇到的问题是尝试根据所选列(或 filteredHeaders)过滤行数据(或 desserts)。

我尝试了以下方法:

computed: 
  ...
  filteredItems () 
    return this.desserts.filter(dessert => 
      return this.filteredHeaders.some(header => 
        return Object.keys(header).some(prop => 
          return dessert[prop] != header[prop] && header.visible
        )
      )
    )
  

即使没有抛出错误,filteredItems 的结果仍然是原始desserts 的结果以及应排除的属性(当visible 被复选框集合设置为false 时)仍在显示。

我确定我很接近,但接近不会让我得到那支雪茄(俗话说)!

【问题讨论】:

【参考方案1】:

这个方法应该能大致达到你想要的效果:

const headers = [
    text: "Dessert (100g serving)",
    align: "left",
    sortable: false,
    value: "name",
    visible: true
  ,
  
    text: "Calories",
    value: "calories",
    visible: true
  ,
  
    text: "Fat (g)",
    value: "fat",
    visible: true
  ,
  
    text: "Carbs (g)",
    value: "carbs",
    visible: true
  ,
  
    text: "Protein (g)",
    value: "protein",
    visible: true
  ,
  
    text: "Iron (%)",
    value: "iron",
    visible: true
  
];

const desserts = [
    name: "Frozen Yogurt",
    calories: 159,
    fat: 6.0,
    carbs: 24,
    protein: 4.0,
    iron: "1%"
  ,
  
    name: "Ice cream sandwich",
    calories: 237,
    fat: 9.0,
    carbs: 37,
    protein: 4.3,
    iron: "1%"
  ,
  
    name: "Eclair",
    calories: 262,
    fat: 16.0,
    carbs: 23,
    protein: 6.0,
    iron: "7%"
  ,
  
    name: "Cupcake",
    calories: 305,
    fat: 3.7,
    carbs: 67,
    protein: 4.3,
    iron: "8%"
  
];

const filterRows = (rows, headers) => 
  // Map over the full list of rows to filter down
  return rows.map(row => 
    // Create a new row to return to avoid mutating
    const filteredRow = ;
    // Loop through each header and copy the row value corresponding to that header value
    headers.forEach(header => 
      filteredRow[header.value] = row[header.value];
    );
    // Return the copied and filtered row
    return filteredRow;
  );
;

console.log(filterRows(desserts, headers));
console.log(filterRows(desserts, [
  text: "Iron (%)",
  value: "iron",
  visible: true
]));

【讨论】:

我会接受这个作为答案,因为它是最容易理解的。仅供参考,这是我对解决方案的实施 - CodePen

以上是关于急:比较两组数据~~~一组来自excel,一组来自一个List<obj>,数据量excel和list各有1000多~~~的主要内容,如果未能解决你的问题,请参考以下文章

通过JS如何随机选择一组数据中的一个

R语言中只想要一组数据中前10个。怎么编辑?

我如何(更)轻松地比较两组数字?

急!!!C语言:输出两组数组中相同的数字

请高手帮我找出这两组数据的对应关系,谢谢!!

根据来自不同对象数组的属性和值过滤对象数组