带有for循环的Java搜索数组不';我找不到所有的结果
我正在使用Java构建一个Android应用程序,我正在尝试构建一个搜索函数来从listview中查找结果。 到目前为止,我已经设法让我的搜索功能工作,但它不能正常工作-它只设法找到某些条件。例如,它查找TC Product name、JC Product name,但找不到Product name。 如果我试图找到某些字符串值,它似乎也找不到所有的值 这是我的密码:带有for循环的Java搜索数组不';我找不到所有的结果,java,string,loops,for-loop,search,Java,String,Loops,For Loop,Search,我正在使用Java构建一个Android应用程序,我正在尝试构建一个搜索函数来从listview中查找结果。 到目前为止,我已经设法让我的搜索功能工作,但它不能正常工作-它只设法找到某些条件。例如,它查找TC Product name、JC Product name,但找不到Product name。 如果我试图找到某些字符串值,它似乎也找不到所有的值 这是我的密码: package com.example.user.sortiment; import android.content.Cont
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;
}
package com.example.user.sortiment;
导入android.content.Context;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.BaseAdapter;
导入android.widget.Filter;
导入android.widget.Filterable;
导入android.widget.TextView;
导入java.util.ArrayList;
导入java.util.List;
导入java.util.Objects;
/**
*用户于2018年5月11日创建
*/
公共类SortimentAdapter扩展BaseAdapter{
拉平机;
列表地图;
列表过滤器映射;
公共空性能过滤(字符序列约束){
String filterString=constraint.toString().toLowerCase();
if(Objects.equals(filterString,“”){
filterMap=map;
notifyDataSetChanged();
返回;
}
int count=map.size();
filterMap=新阵列列表(计数);
Sortiment可过滤部分;
for(int i=0;i
}
我怀疑:if(filterableSortion.name.toLowerCase().contains(filterString))中有问题{
,但我不能完全肯定
有什么想法吗?
谢谢编辑:
现在,完整的代码已经发布,地图似乎是一个列表。除了一些关于地图如何工作的一般信息外,我下面的解释不适用于您的示例
地图,它们是怎么工作的?
您正在为地图上的执行一个,其中键可能不一定按顺序排列
是对地图工作原理的解释
映射是一个键值对字典,而不是您在标题中提到的简单列表/数组
这是我的假设,我可能错了,但我觉得奇怪的是:
filterablesortion=map.get(i);
这一个通过键i
获取,而not通过i
在列表中的第四个位置获取,因为地图不是列表
数学意义上的映射定义为:“元素从一个集合到另一集合的映射。”
请注意,如果映射像数组一样是线性的,则可能无法到达所有元素
核心问题:
您正在使用的map
可能没有线性键,无法通过简单的递增i
for循环访问
通过在调试时检查映射,检查映射的结构
如果键值对看起来不像数组:
01123445
| | | | | |
A B C D E F
那么您的算法将丢失元素
例如,如果在地图中使用键2324添加了一些元素,当您的计数仅为30个元素时,您将错过这些元素,因为您的地图是通过其键稀疏填充的
如果你的地图看起来像
15778923
| | | | | |
A B C D E F
如果对0执行映射,则计数
你会去的
map.get(0)
-不返回任何内容
map.get(1)
-返回A
map.get(2)
-不返回任何内容
map.get(3)
-不返回任何内容
map.get(4)
-不返回任何内容
map.get(5)
-返回B
如果键的顺序与数组“map”中的顺序不同,则使用这种方法会遗漏C、D、E和F
元素
解决方案:
我建议在地图上使用一个适当的迭代器(对于每个循环),而不是使用一个索引为I
线性增加的for
循环,因为你可能会错过地图中的空白
指这个还是这个
后续问题:
- 您能提到您的示例中的
映射是什么数据类型吗?
filterMap=map;
现在您已经更新了答案,很明显,您的“地图”根本不是地图。因此,现在这是无效的。将来,请提供足够的信息,以便您的问题能够得到回答
public void performFiltering(CharSequence constraint) {
String filterString = constraint.toString().toLowerCase();
if (filterString.equals("")) {
filterMap = map;
notifyDataSetChanged();
return;
}
int count = map.size();
filterMap = new ArrayList<Sortiment>(count);
Sortiment filterableSortiment ;
for (filterMap.Entry<String, String> entry : filterMap.entrySet())
{
filterableSortiment = entry.getValue();
if (filterableSortiment.name.toLowerCase().contains(filterString)) {
filterMap.add(filterableSortiment);
}
}
notifyDataSetChanged();
}
public void性能过滤(字符序列约束){
String filterString=constraint.toString().toLowerCase();
if(filterString.equals(“”){
filterMap=map;
notifyDataSetChanged();
返回;
}
import java.util.List;
import java.util.stream.Collectors;
public void performFiltering(CharSequence constraint) {
String filterString = constraint.toString().toLowerCase();
// Define what to do, if filterString is an empty String
if(filterString.isEmpty()){
filterMap = map;
notifyDataSetChanged();
return;
}
// Filter through the sortiment list
filterMap = map.stream()
.filter(s -> s.name.toLowerCase().contains(filterString))
.collect(Collectors.toList());
notifyDataSetChanged();
}
android:windowSoftInputMode="stateHidden"
android:windowSoftInputMode="adjustPan"