当前位置: 首页 > 知识库问答 >
问题:

搜索数组中的标记并定位它们

房泉
2023-03-14
String [] thePlaces = {"Thirsty Monk", "Cocolino", "The Melting Pot", "De Danu", "Carciuma", "Boca", "Bar Acasa"};

数组中的所有字符串都由单独的标记定义,如下所示:

 //Carciuma
    LatLng test1 = new LatLng(43.604892, 1.476562);
    mMap.addMarker(beerMarker.position(test1).title("Carciuma"));

我声明了以下方法:

private void gotoLocation(double lat, double lng, float zoom){

    LatLng latLng = new LatLng(lat, lng);
    CameraUpdate update = CameraUpdateFactory.newLatLngZoom(latLng, zoom);
    mMap.moveCamera(update);
}

private void hideSoftKeyboard(View v){
    InputMethodManager imm = (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
}


public void locateFromString(View view) {

    hideSoftKeyboard(view);

    TextView tv = (TextView) findViewById(R.id.editText1);
    String searchString = tv.getText().toString();

在我的地图上,我创建了一个搜索字段,我只想在数组的字符串中执行搜索。因此,当我按search按钮定位用户引入的标记名称时,将调用locateFromString方法。在我看来,这个方法应该查看用户引入的标记是否存在于数组中。如果它存在,则应该使用gotoLocation方法定位它,如果不存在,则应该显示Toast表示搜索的标记不在数组中。

我到底要怎么做?在数组中搜索,如果找到了名称来定位它?

提前感谢您的回答!

更新

public class MainActivity extends AppCompatActivity implements OnMapReadyCallback {

GoogleMap mMap;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
    mapFragment.getMapAsync(this);



    assert getSupportActionBar() != null;
    ActionBar actionBar = getSupportActionBar();
    actionBar.setLogo(R.mipmap.ic_launcher);
    actionBar.setDisplayUseLogoEnabled(true);
    actionBar.setDisplayShowHomeEnabled(true);


}

@Override
public boolean onCreateOptionsMenu(Menu menu) {

    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.menu_main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()){

        case R.id.location:
            Toast.makeText(getApplicationContext(), "Location selected", Toast.LENGTH_LONG).show();
            return true;
        case R.id.map_type:
            Toast.makeText(getApplicationContext(), "Map Type selected", Toast.LENGTH_LONG).show();
            return true;
        case R.id.share_app:
            Toast.makeText(getApplicationContext(), "Share the APP", Toast.LENGTH_LONG).show();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }

}

@Override
public void onMapReady(GoogleMap googleMap) {

    mMap = googleMap;


    LatLng cityView = new LatLng(43.604346, 1.443760);
    mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(cityView, 12));


    MarkerOptions beerMarker = new MarkerOptions()
                            .icon(BitmapDescriptorFactory.fromResource(R.drawable.beer_marker));


    // The Thirsty monk
    LatLng thirstyMonk = new LatLng(43.607044, 1.450307);
    mMap.addMarker(beerMarker.position(thirstyMonk).title("Thirsty Monk"));
    // The Cocolino
    LatLng cocolino = new LatLng(43.571505, 1.417759);
    mMap.addMarker(beerMarker.position(cocolino).title("Cocolino"));
    //The Melting Pot
    LatLng meltingPot = new LatLng(43.607469, 1.447162);
    mMap.addMarker(beerMarker.position(meltingPot).title("The Melting Pot"));
    //De Danu
    LatLng deDanu = new LatLng(43.600723, 1.455917);
    mMap.addMarker(beerMarker.position(deDanu).title("De Danu"));
    //Carciuma
    LatLng test1 = new LatLng(43.604892, 1.476562);
    mMap.addMarker(beerMarker.position(test1).title("Carciuma"));
    //Test2
    LatLng test2 = new LatLng(43.604496, 1.474924);
    mMap.addMarker(beerMarker.position(test2).title("Boca"));
    //Test3
    LatLng test3 = new LatLng(43.604781, 1.474502);
    mMap.addMarker(beerMarker.position(test3).title("Bar Acasa"));

}

private void gotoLocation(double lat, double lng, float zoom){

    LatLng latLng = new LatLng(lat, lng);
    CameraUpdate update = CameraUpdateFactory.newLatLngZoom(latLng, zoom);
    mMap.moveCamera(update);
}

private void hideSoftKeyboard(View v){
    InputMethodManager imm = (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
}


public void locateFromString(View view) {

    hideSoftKeyboard(view);

    TextView tv = (TextView) findViewById(R.id.editText1);
    String searchString = tv.getText().toString();



    ArrayList<String> thePlaces = new ArrayList<>();
    thePlaces.add("Thirsty Monk");
    thePlaces.add("Cocolino");
    thePlaces.add("The Melting Pot");
    thePlaces.add("De Danu");
    thePlaces.add("Carciuma");
    thePlaces.add("Boca");
    thePlaces.add("Bar Acasa");


    ArrayList<String> places = new ArrayList<String>(Arrays.asList(thePlaces));
    if (places.contains(searchString)) {



        //do something
    };

   // if (thePlaces.contains(searchString)){



    //if (searchString.length() > 0){

      //  Toast.makeText(this, "Searching for: " + searchString, Toast.LENGTH_SHORT).show();

    //} else {
   //     Toast.makeText(this, "There is no " + searchString + " subscribed to this app!", Toast.LENGTH_LONG).show();
   // }


    //Geocoder gc = new Geocoder(this);


}
    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.gadgetcatch.happyhourtoulouse.MainActivity">

    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="center_vertical"
        android:orientation="horizontal"
        android:id="@+id/search_pub"
        android:paddingLeft="10dp"
        android:paddingRight="10dp">


        <AutoCompleteTextView
            android:id="@+id/editText1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_toLeftOf="@+id/button1"
            android:layout_toStartOf="@+id/button1"
            android:ems="10"
            android:hint="@string/search_pub"
            android:inputType="textCapWords">

            <requestFocus />
        </AutoCompleteTextView>

        <Button
            android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentEnd="true"
            android:layout_alignParentRight="true"
            android:text="@string/search_go"
            android:onClick="locateFromString"/>
    </RelativeLayout>

    <fragment
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/map"
        class="com.google.android.gms.maps.SupportMapFragment"/>


</LinearLayout>

共有1个答案

章嘉致
2023-03-14

如果将数组转换为ArrayList不是问题,那么可以使用contains()方法检查searchString是否在列表中。如果希望搜索不区分大小写--将数组和searchString中的值转换为大写/小写。请参见以下示例:

    ...
    ArrayList<String> places = new ArrayList<>(Arrays.asList(thePlaces));
    if (places.contains(searchString)) {
        //do something
    };

更新

关于locateFromString方法-因为您已经有了ArrayListThePlaces,所以不需要Places。另外,我建议将thePlaces作为实例变量,比如mmap,并将其填充到onCreate或初始化器块中。这样,数组列表将只创建一次,而不是每次调用LocateFromString时创建。

public void locateFromString(View view) {
    hideSoftKeyboard(view);
    TextView tv = (TextView) findViewById(R.id.editText1);
    String searchString = tv.getText().toString();

    ArrayList<String> thePlaces = new ArrayList<>();
    thePlaces.add("Thirsty Monk");
    thePlaces.add("Cocolino");
    thePlaces.add("The Melting Pot");
    thePlaces.add("De Danu");
    thePlaces.add("Carciuma");
    thePlaces.add("Boca");
    thePlaces.add("Bar Acasa");


    if (thePlaces.contains(searchString)) {
        //call goToLocation
    } else {
        Toast.makeText(this, "There is no " + searchString + " subscribed to this app!", Toast.LENGTH_LONG).show();
    }
}
 类似资料:
  • 我正在编写一个。NET应用程序,它应该读取一个大约200页长的。docx文件(通常是documentformat.openxml2.5),以查找文档应该包含的某些标记的所有出现情况。明确地说,我不是在寻找OpenXML标记,而是应该由文档编写器设置到文档中的标记,作为在第二阶段需要填充的值的占位符。此类标记应采用以下格式: (其中TAG可以是任意字符序列)。正如我所说的,我必须找到这类标签的所有出

  • 问题内容: 我有这个代码 如何搜索? 问题答案: 正如简单地返回一个字典一样,您可以使用适用于字典的运算符: 编辑:要给出有关如何遍历数据的想法,请考虑以下示例: 检查数据结构将使您可以根据需要进行导航。您已经拥有的电话就是一个很好的起点。 Edit2:另一个尝试。这将获得您在词典列表中提到的文件。这样,我认为您应该能够使其适应您的需求。 然后 “在其中搜索”,执行以下操作:

  • 你好,我正在尝试编写关键字搜索parralele数组的代码,我有2个数组 我想能够搜索关键字,所以如果我输入巴德,我会得到一个结果 “芽之光”的酒精度为4.2%“百威”的酒精度为5.0% 可悲的是,我不知道如何做到这一点,我一直在看一些代码,我从搜索文件扫描器console=new Scanner(system.in);system.out.print(“搜索短语:”);字符串搜索=Console

  • 问题内容: 假设我们有以下js数组 是否有一个js内置函数或jQuery的一个,使用它可以搜索阵列 AR 的 VAL ? 谢谢 *_ _ _更新 _ _ * _ __** 根据 融合的 反应,我创建了这个原型 问题答案: 您可以创建一个哈希。

  • 我正在使用edge ngram标记器来提供部分匹配。我的文件看起来像 我的映射如下 以下查询给了我3个正确的文档(,,) 但是当我输入时,它会给我0个文档 我希望这将返回1个文档,但出于某种原因,它似乎没有索引令牌中的数字。让我知道,如果我错过了什么东西在这里。

  • 问题内容: 我有一个排序的数组,想要对它进行二进制搜索。 所以我想问一下Swift库中是否已有诸如sort等的东西?还是有类型独立版本可用? 当然,我可以自己编写它,但是我想避免再次发明轮子。 问题答案: 这是使用二进制搜索的通用方法: