手机打包apk问题,冒泡排序、对字符串进行全排列以及从HashMap中根据商品名称查询价格的功能,Main.java,MainActivity.java,activity_main.xml
package com.user.app;
public class Main {
public static class BubbleSort {
public static void bubbleSortAscending(double[] arr) {
int n = arr.length;
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
// swap arr[j+1] and arr[j]
double temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
public static void bubbleSortDescending(double[] arr) {
int n = arr.length;
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (arr[j] < arr[j + 1]) {
// swap arr[j+1] and arr[j]
double temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
public static void printVertical(double[] arr) {
int n = arr.length;
for (int i = 0; i < n; i++) {
System.out.println(arr[i]);
}
}
public static void printHorizontal(double[] arr) {
int n = arr.length;
for (int i = 0; i < n; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
}
public static void main(String[] args) {
java.util.Scanner scanner = new java.util.Scanner(System.in);
System.out.println("请输入要排序的数字,每个数字之间用空格或逗号隔开:");
String input = scanner.nextLine();
String[] strArr = input.split("[ ,]+");
double[] arr = new double[strArr.length];
for (int i = 0; i < strArr.length; i++) {
arr[i] = Double.parseDouble(strArr[i]);
}
System.out.println("请选择输出方式:");
System.out.println("1. 竖排输出");
System.out.println("2. 横排输出");
int option = scanner.nextInt();
// sort in ascending order
bubbleSortAscending(arr);
System.out.println("从小到大排序:");
if (option == 1) {
printVertical(arr);
} else if (option == 2) {
printHorizontal(arr);
} else {
System.out.println("无效的选项,请重新运行程序!");
}
// sort in descending order
bubbleSortDescending(arr);
System.out.println("从大到小排序:");
if (option == 1) {
printVertical(arr);
} else if (option == 2) {
printHorizontal(arr);
} else {
System.out.println("无效的选项,请重新运行程序!");
}
}
}
}
package com.user.app;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;
import java.util.Arrays;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
// 定义私有变量
private EditText mEditText; // 输入框
private Spinner mSpinner; // 下拉框
private Button mButton; // 按钮
private TextView mTextView; // 文本框
// 当活动被创建时调用
/**
* onCreate
* @param savedInstanceState
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 获取控件引用
mEditText = (EditText) findViewById(R.id.edit_text); // 输入框
mSpinner = (Spinner) findViewById(R.id.spinner); // 下拉框
mButton = (Button) findViewById(R.id.button); // 按钮
mTextView = (TextView) findViewById(R.id.text_view); // 文本框
// 创建适配器并将其设置到下拉框中
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
this, R.array.sort_options, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
mSpinner.setAdapter(adapter);
// 注册点击事件监听器
mButton.setOnClickListener(this);
}
// 处理点击事件
@Override
public void onClick(View view) {
if (view == mButton) { // 如果点击的是按钮
// 从输入框中读取文本并解析成双精度浮点数数组
String input = mEditText.getText().toString();
String[] array = input.split("\\s+");
double[] nums = new double[array.length];
for (int i = 0; i < array.length; i++) {
nums[i] = Double.parseDouble(array[i]);
}
// 检查用户选择的排序方向,并根据升序或降序的方式对数组进行排序
boolean ascending = (mSpinner.getSelectedItemPosition() == 0);
Arrays.sort(nums);
if (!ascending) {
for (int i = 0; i < nums.length / 2; i++) {
double temp = nums[i];
nums[i] = nums[nums.length - i - 1];
nums[nums.length - i - 1] = temp;
}
}
// 将排好序的数组数据格式化为一个字符串,并将其设置为文本视图的内容,从而在屏幕上显示排序结果
StringBuilder sb = new StringBuilder();
for (double num : nums) {
sb.append(num).append('\n');
}
mTextView.setText(sb.toString());
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
android:id="@+id/edit_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/enter_numbers" />
<Spinner
android:id="@+id/spinner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:entries="@array/sort_options"/>
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/sort_button" />
<TextView
android:id="@+id/text_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="@android:style/TextAppearance.Large" />
</LinearLayout>
任务: app ==> 合并清单文件(无需执行)
任务: app ==> 合并动态链接库(跳过)
任务: app ==> 合并Java资源文件(无需执行)
任务: app ==> 合并清单文件(无需执行)
任务: app ==> 编译项目资源文件(无需执行)
任务: app ==> 编译项目依赖资源文件(无需执行)
任务: app ==> 链接资源文件(无需执行)
任务: app ==> 编译项目资源文件(无需执行)
任务: app ==> 编译项目依赖资源文件(无需执行)
任务: app ==> 链接资源文件(无需执行)
任务: app ==> 检查调试工具(无需执行)
任务: app ==> 编译AIDL文件(跳过)
任务: app ==> 编译Java源文件
.../MainActivity.java:第4行
错误: 程序包android.support.v7.app不存在
import android.support.v7.app.AppCompatActivity;
^
.../MainActivity.java:第14行
错误: 找不到符号
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
^
符号: 类 AppCompatActivity
.../MainActivity.java:第27行
错误: 方法不会覆盖或实现超类型的方法
@Override
^
.../MainActivity.java:第29行
错误: 找不到符号
super.onCreate(savedInstanceState);
^
符号: 变量 super
位置: 类 MainActivity
.../MainActivity.java:第30行
错误: 找不到符号
setContentView(R.layout.activity_main);
^
符号: 方法 setContentView(int)
位置: 类 MainActivity
.../MainActivity.java:第33行
错误: 找不到符号
mEditText = (EditText) findViewById(R.id.edit_text); // 输入框
^
符号: 变量 edit_text
位置: 类 id
.../MainActivity.java:第34行
错误: 找不到符号
mSpinner = (Spinner) findViewById(R.id.spinner); // 下拉框
^
符号: 变量 spinner
位置: 类 id
.../MainActivity.java:第35行
错误: 找不到符号
mButton = (Button) findViewById(R.id.button); // 按钮
^
符号: 变量 button
位置: 类 id
.../MainActivity.java:第36行
错误: 找不到符号
mTextView = (TextView) findViewById(R.id.text_view); // 文本框
^
符号: 变量 text_view
位置: 类 id
.../MainActivity.java:第40行
错误: 找不到符号
this, R.array.sort_options, android.R.layout.simple_spinner_item);
^
符号: 变量 array
位置: 类 R
10 个错误
任务: app ==> 编译Java源文件 执行失败
Compile java source files failed!
b8.a.execute(Unknown Source:89)
com.qiplat.api.project.task.BaseTaskExecutor.executeInternal(Unknown Source:159)
com.qiplat.api.project.task.BaseTaskExecutor.waitTasks(Unknown Source:21)
com.qiplat.api.project.task.BaseTaskExecutor.executeInternal(Unknown Source:46)
com.qiplat.api.project.task.BaseTaskExecutor.waitTasks(Unknown Source:21)
com.qiplat.api.project.task.BaseTaskExecutor.executeInternal(Unknown Source:46)
com.qiplat.api.project.task.BaseTaskExecutor.waitTasks(Unknown Source:21)
com.qiplat.api.project.task.BaseTaskExecutor.executeInternal(Unknown Source:46)
com.qiplat.api.project.task.BaseTaskExecutor.lambda$execute$0(Unknown Source:21)
com.qiplat.api.project.task.BaseTaskExecutor.a(Unknown Source:0)
com.qiplat.api.project.task.a.run(Unknown Source:6)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
java.lang.Thread.run(Thread.java:922)
构建失败
出现这些错误的原因是:
1. 您的 Android Studio 版本过低,不支持 AppCompatActivity 等类。请更新到最新版本。
2. 您没有在 gradle 文件中添加 android support v7 库的依赖。请添加:
gradle
dependencies {
implementation 'com.android.support:appcompat-v7:28.0.0'
}
3. 您的 R 类没有被正确生成,所以找不到 R.id.edit_text 等资源 ID。请点击 Sync Project with Gradle Files 按钮来重新生成 R 类。
4. 您没有在 AndroidManifest.xml 文件中为 MainActivity 指定 android:theme 属性。请添加:
xml
<activity android:name=".MainActivity"
android:theme="@style/AppTheme">
</activity>
以及在 styles.xml 文件中定义 AppTheme:
xml
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
</style>
修复以上问题后,您的项目应该可以正常编译通过。请重新编译项目,并在设备或模拟器上运行,查看结果。
另外,对于 java 程序中实现的冒泡排序算法和字符串全排列功能,我在这里不再赘述。您可以参考相关学习资料学习和实现。
而从 HashMap 中根据 key 查询 value 的方法很简单,如:
java
HashMap<String, Double> map = new HashMap<>();
map.put("Apple", 10.5);
map.put("Orange", 5.2);
double price = map.get("Apple"); // 10.5
请根据您的需求在项目中实现这些功能。如果还有其他问题,欢迎再提出来。
手机打包apk过程:
1. 点击菜单栏的 Build -> Generate Signed Bundle / APK...
2. 在弹出的窗口中选择 APK 选项,点击下一步。
3. 选择您的应用程序和模块,点击下一步。
4. 在下一窗口中选择您的签名文件(若无则点击“创建新的...”进行创建),点击下一步。
5. 在下一窗口预览您的apk信息,然后点击“完成”开始构建apk。
6. 构建完成后,您的apk文件会被保存在项目的app/build/outputs/apk/ 目录下。
7. 您可以直接安装这个apk文件到您的手机,或者发布到各大应用市场。
哈希表:由数组+链表组成的
当我们往HashMap中put元素的时候,先根据key的hashCode重新计算hash值,根据hash值得到这个元素在数组中的位置(即下标)
如果数组该位置上已经存放有其他元素了,那么在这个位置上的元素将以链表的形式存放,新加入的放在链头,最先加入的放在链尾。
如果数组该位置上没有元素,就直接将该元素放到此数组中的该位置上。