Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有for循环的Java搜索数组不';我找不到所有的结果_Java_String_Loops_For Loop_Search - Fatal编程技术网

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

带有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

我正在使用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;
}
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"