gpt4 book ai didi

java - 在数组中搜索标记并找到它们

转载 作者:行者123 更新时间:2023-12-01 10:07:34 25 4
gpt4 key购买 nike

所以,这是我的问题:

我在onMapReady方法中定义了一个String数组:

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();


在我的地图上,我创建了一个搜索字段,我只想在数组的字符串内执行搜索。因此,当我按下搜索按钮来查找用户引入的标记名称时,将调用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
在这里,我用自动完成功能更改了EditText:

    <?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>


这是日志:

04-02 19:42:08.791 11984-11984 / com.gadgetcatch.happyhourtoulouse E / AndroidRuntime:FATAL EXCEPTION:main
流程:com.gadgetcatch.happyhourtoulouse,PID:11984
java.lang.IllegalStateException:无法执行android:onClick的方法
在android.support.v7.app.AppCompatViewInflater $ DeclaredOnClickListener.onClick(AppCompatViewInflater.java:293)
在android.view.View.performClick(View.java:5254)
在android.view.View $ PerformClick.run(View.java:21179)
在android.os.Handler.handleCallback(Handler.java:739)
在android.os.Handler.dispatchMessage(Handler.java:95)
在android.os.Looper.loop(Looper.java:145)
在android.app.ActivityThread.main(ActivityThread.java:6837)
在java.lang.reflect.Method.invoke(本机方法)
在java.lang.reflect.Method.invoke(Method.java:372)
在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1404)
在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)
造成原因:java.lang.reflect.InvocationTargetException
在java.lang.reflect.Method.invoke(本机方法)
在java.lang.reflect.Method.invoke(Method.java:372)
在android.support.v7.app.AppCompatViewInflater $ DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288)
在android.view.View.performClick(View.java:5254)
在android.view.View $ PerformClick.run(View.java:21179)
在android.os.Handler.handleCallback(Handler.java:739)
在android.os.Handler.dispatchMessage(Handler.java:95)
在android.os.Looper.loop(Looper.java:145)
在android.app.ActivityThread.main(ActivityThread.java:6837)
在java.lang.reflect.Method.invoke(本机方法)
在java.lang.reflect.Method.invoke(Method.java:372)
在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1404)
在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)
原因:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法'boolean java.util.ArrayList.contains(java.lang.Object)'
在com.gadgetcatch.happyhourtoulouse.MainActivity.locateFromString(MainActivity.java:182)
在java.lang.reflect.Method.invoke(本机方法)
在java.lang.reflect.Method.invoke(Method.java:372)
在android.support.v7.app.AppCompatViewInflater $ DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288)
在android.view.View.performClick(View.java:5254)
在android.view.View $ PerformClick.run(View.java:21179)
在android.os.Handler.handleCallback(Handler.java:739)
在android.os.Handler.dispatchMessage(Handler.java:95)
在android.os.Looper.loop(Looper.java:145)
在android.app.ActivityThread.main(ActivityThread.java:6837)
在java.lang.reflect.Method.invoke(本机方法)
在java.lang.reflect.Method.invoke(Method.java:372)
在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1404)
在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)

最佳答案

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

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


更新

关于 locateFromString方法-由于您已经具有ArrayList thePlaces,因此不需要 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();
}
}

关于java - 在数组中搜索标记并找到它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36338916/

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