gpt4 book ai didi

带有for循环的Java搜索数组找不到所有结果

转载 作者:行者123 更新时间:2023-11-29 04:16:54 24 4
gpt4 key购买 nike

我正在使用 Java 构建一个 Android 应用程序,并且我正在尝试构建一个搜索功能以从 ListView 中查找结果。到目前为止,我已经设法让我的搜索功能正常工作,但它不能正常工作——它只能设法找到特定的条件。例如,它找到了 TC Product name,JC Product name 但没有找到 Product name。如果我尝试查找某些字符串值,它似乎也找不到所有值。

这是我的代码:

package com.example.user.sortiment;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

/**
* Created by user on 11.05.2018
*/

public class SortimentAdapter extends BaseAdapter {

LayoutInflater mInflator;
List<Sortiment> map;
List<Sortiment> filterMap;

public void performFiltering(CharSequence constraint) {

String filterString = constraint.toString().toLowerCase();
if (Objects.equals(filterString, "")) {
filterMap = map;
notifyDataSetChanged();
return;
}

int count = map.size();
filterMap = new ArrayList<Sortiment>(count);

Sortiment filterableSortiment ;

for (int i = 0; i < count; i++) {
filterableSortiment = map.get(i);
if
(filterableSortiment.name.toLowerCase().contains(filterString)) {
filterMap.add(filterableSortiment);
}
}

notifyDataSetChanged();

}

public SortimentAdapter(Context c, List<Sortiment> inputMap) {
mInflator = (LayoutInflater)
c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
map = inputMap;
filterMap = inputMap;
}

@Override
public int getCount() {
return filterMap.size();
}

@Override
public Object getItem(int position) {
return filterMap.get(position);
}

@Override
public long getItemId(int position) {
return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

View v = mInflator.inflate(R.layout.item_layout,null);
TextView nameTextView = (TextView) v.findViewById(R.id.nameTextView);
TextView priceTextView = (TextView) v.findViewById(R.id.priceTextView);

Sortiment viewObject = filterMap.get(position);
nameTextView.setText(viewObject.name);
//priceTextView.setText(String.format("%.0f", prices.get(position)));
priceTextView.setText(viewObject.ean.toString());

return v;
}

我怀疑一个问题:if (filterableSortiment.name.toLowerCase().contains(filterString)) {,但我不完全确定。

有什么想法吗?谢谢

最佳答案

编辑:

现在已经贴出了完整的代码,图好像是一个列表。除了关于 map 工作原理的一些一般信息外,我的以下解释不适用于您的示例。

map ,它们是如何工作的?

您正在 map 上执行 for,其中的键可能不一定按顺序排列。

Here是对 map 工作原理的解释。

map 是键值对字典,而不是标题中提到的简单列表/数组。

这是我的假设,我可能是错的,但对我来说看起来很奇怪的是这一行:

filterableSortiment = map.get(i);

这个通过键 i 获取,通过列表中的第 i 位置,因为 map 不是列表。

数学意义上的映射定义为:“元素从一组到另一组的映射。”

注意映射是否像数组一样是线性的,否则您可能无法到达所有元素。

核心问题:

您正在使用的 map 可能没有线性键,无法通过简单的递增 i for 循环访问。

通过在调试时检查 map 来检查 map 的结构。

如果您的键值对看起来不像数组:

0 1 2 3 4 5

| | | | | |

A B C D E F

那么你的算法将遗漏元素。

例如,如果在 map 中添加了一些带有键 2324 的元素,当您的计数仅为 30 个元素时,您将错过它,因为您的 map 通过其键稀疏地填充。

如果你的 map 看起来像

1 5 7 8 9 23

| | | | | |

A B C D E F

如果你做一个 for 0 > map.count

你会去

map.get(0) - 什么都不返回

map.get(1) - 返回 A

map.get(2) - 什么都不返回

map.get(3) - 什么都不返回

map.get(4) - 什么都不返回

map.get(5) - 返回 B

C、D、E 和 F 元素会被这种方法遗漏,如果键没有像数组“映射”中那样有序。

解决方案:

我建议在 map 上使用适当的迭代器(针对每个循环),而不是使用具有线性递增索引的for 循环i 因为您可能会错过 map 中的空白。

引用这个answer或者这个 answer

后续问题:

  • 您能说说示例中的map 是什么数据类型吗?

filterMap = map;

关于带有for循环的Java搜索数组找不到所有结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51781279/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com