安卓界面跳转

  • intent界面跳转与传数据

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    package com.example.python.myapp;

    import android.content.Intent;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;

    public class All_single_Activity extends AppCompatActivity {

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


    //接受数据
    Intent intent4 = getIntent();
    String name = (String)intent4.getSerializableExtra( "heroName" );
    Hero hero = new Hero(name);
    TextView info = (TextView)findViewById( R.id.all_hero_info );
    String story = hero.getHeroStory(name);
    info.setText( story );

    //返回逻辑上一页
    Button btn = (Button)findViewById( R.id.all_back_home );
    btn.setOnClickListener( new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    Intent intent = new Intent( All_single_Activity.this,DetailActivity.class );
    All_single_Activity.this.startActivity( intent );
    }
    } );
    }
    }
  • listview与监听

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    package com.example.python.myapp;

    import android.content.Intent;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.AdapterView;
    import android.widget.ArrayAdapter;
    import android.widget.Button;
    import android.widget.ListView;

    public class DetailActivity extends AppCompatActivity implements AdapterView.OnItemClickListener {


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

    ListView listView = (ListView)findViewById(R.id.list_item);
    //适配器
    listView.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,hero));

    //监听
    listView.setOnItemClickListener(this);


    //返回主页
    Button back_home = (Button)findViewById(R.id.all_back_home);
    back_home.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    Intent intent = new Intent(DetailActivity.this,MainActivity.class);
    DetailActivity.this.startActivity(intent);
    }
    });
    }

    private static final String[] hero = new String[]{
    "猎空",
    "小美",
    "温斯顿",
    "D.VA",
    "布丽吉塔"
    };
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    ListView item = (ListView)findViewById( R.id.list_item );
    String str = item.getItemAtPosition( position ).toString();
    // Toast.makeText(DetailActivity.this,str,Toast.LENGTH_LONG).show();

    Intent intent = new Intent( DetailActivity.this,All_single_Activity.class );
    Bundle mExtra = new Bundle();
    mExtra.putSerializable( "heroName",str );
    intent.putExtras( mExtra );
    DetailActivity.this.startActivity( intent );
    }
    }

插入排序

1.算法

插入排序由N-1趟排序组成。对于P = 1 趟到 P = N - 1趟,插入排序保证从位置0到位置P上的元素为已排序状态。插入排序利用了这样的事实:位置0到位置 P - 1上的元素是已排过序的。
下表表达了一般的方法。在第P趟,我们将位置P上的元素想做移动到它在前P+1个元素中的正确位置上。下面的程序实现了该想法。第2行到第5行实现数据移动而没有明显使用交换。位置P上的元素存于Tmp,而(在位置P之前)所有更大的元素都被向右移动一个位置。然后Tmp被置于正确的位置上。这种方法与实现二叉堆时所用到的技巧相同。

初始 34 8 64 51 32 21 移动的位置
在p=1之后 8 34 64 51 32 21 1
在p=2之后 8 34 64 51 32 21 0
在p=3之后 8 34 51 64 32 21 1
在p=4之后 8 32 54 51 64 21 3
在p=5之后 8 21 32 34 51 64 4
1
2
3
4
5
6
7
8
9
10
11
12
13
void InsertionSort(ElementType A[], int N)
{
int j, P;

ElementType Tmp;
for( P = 1; P < N; P++) //1
{
Tmp = A[P]; //2
for( j = P; j > 0 && A[ j-1 ] > Tmp; j--) //3
A[j] = A[j-1]; //4
A[j] = Tmp; //5
}
}

2.插入排序的分析

由于嵌套循环的每一个都花费N次迭代,因此插入排序为O(N2),而且这个界是精确的,因为以反序输入可以达到该界。精确计算指出对于P的每一个值,第4行的测试最多执行P+1次。对所有的P求和,得到总数为
SUM = 2 + 3 + 4 + ... + N = O(N<sup>2</sup>)
另一方面,如果输入数据已排序,那么运行时间为O(N),因为内层for循环的检测是立即判定不成立而终止。事实上,如果输入几乎被排序,那么插入排序将运行得很快。

c++学习记录七:多态性:对象独立性(抽象类,虚函数)

(本文来自c++简明教程)
对象要想真正有用,就必须具有独立性。每个对象都应该相当于一台微型计算机,能发送并响应消息。只要一个新的对象类型使用了恰当的接口,你就应该能够把它“插接”到现有的软件上。
从字面意义上看多态性意味着“多种形式”。在最基本的级别上,它意味着以多种方式实现相同的操作。它最重要的意义在于,无需更改使用了一个对象的代码,就能将对象替换成另一个对象类型,而程序仍能正常工作。
打个比方。你的子处理软件能和你购买的任何打印机正确地交互。你甚至可以在5年之后,拔除用旧的打字机,接上一台当前尚未问世的打字机。今天写字处理软件的人不需要知道所有规格的打印机的详细信息。
这正是“多态性”存在的理由:使用所有软件对象都能像硬件组件那样工作,它们能协同工作,并根据需要进行置换。旧的软件能顺利连接较新的软件······那自是“重用性”的含义。

阅读更多

c++学习记录六:继承

(本文来自c++简明教程)
类最突出的一个特性就是“子类化”(subclassing),也就是一个类从以前定义好的一个类继承它的成员。处于几方面的原因,这个特性显得非常重要。
第一个原因是子类化处理允许你定制现有的软件。你可以拿到别人创建的一个类,在上面添加自己独有的新功能。还可以覆盖类的任何或者全部功能。这样一来,类就具有了扩展性和重用性(我保证这是你在本章见到的最后两个专业术语)。
听起来似乎很不错……有时的确如此!但是,考虑到本章要讨论的一些技术原因,你的工作并非总是那么轻松。最起码,你必须修订所有构造函数。
使用一个继承层次结构和创建接口时,也需要用到“子类化”技术,详情将在下一章讨论。

阅读更多

c++学习记录五:析构函数、this关键字和string类

(本文来自c++简明教程)
随着你操纵类的技能越来越熟练,迟早会面临资源管理的问题。
更具体地说,当你设计出特定类型的对象时,程序代码必须要求系统分配一些资源。其中,最常用的资源类型就是内存。正如本章要说明的那样,资源管理会造成一些特殊的问题。不过,辛运的是,c++提供了专门的特性来解决这些问题。
本章展示了如何写一个高级的String类,它简单而又全面地演示了资源管理问题。
说到这个类的目的,它和大多数类一样,都是隐藏细节。操纵字符串时,必须和内存打交道,而String类的宗旨就是让类的用户不必关系内存的分配和回收问题。简单地说,String类封装了char数组,并对它们进行处理,使字符串在类的用户面前表现为一种简单的数据类型,而不是一个复杂的结构。
注意:本章描述的String类是c++中的string类的一个简单版本。假如你的编译器提供了用于支持string类的库,就不必使用本章定义的这个类。不过,通过学习自己编写这样的一个类,有助于你掌握c++面向对象编程时的一些重要概念。尤其是,本章使用String类来展示this关键字、析构函数以及“深拷贝”的概念。


阅读更多

c++学习记录四:New操作符和StringParser类

(本文来自c++简明教程)
本文要强调的一个重点在于,类和面向对象编程并没有什么神秘之处,和其他某些书强调的不同,类之所以有用,并不是因为它是一个类,而是因为它提供了一系列相互练习的服务,能够解决一般性的编程问题。
一个常见的编程任务是获取输入,并对其进行分析。本章将介绍一个StringParser类,它能将一个输入字符串分解成一系列子串,每个子串中都包含一个单词。
注意:该类的大多数功能已经有strtok库函数提供。但是,你仍然有必要知道如何写一个功能相似的类。另外,strtok库函数的一个缺点在于,它不能同时扫描多个字符串,但是,采取面向对象的编程的方式,这就不是个问题。

在讨论这个类的过程中,本章还讨论了new关键字,它是c++中用于操纵类的最有用的关键字之一。简单地说,使用这个关键字允许你申请内存,为可能要用到的新变量留出足够的空间。

阅读更多

c++学习记录三:操作符函数

(本文来自《c++简明教程》)


完成了前两章的学习之后,我们应该掌握了如何写一个自己的类,使其能像标准数据类型那样使用。
但是,相较于真正的标准数据类型,目前写的类还存在一些不足。对于int,float,double和char等标准数据类型,它们最重要的一个特定就是,可以直接对它们进行操作。事实上,没有这些操作符,很难在c++中执行任何运算。
c++允许你为自己的类的对象定义如何执行这些运算(比如加,减,乘,除)。还可以为类的对象定义一个“测试相等性”操作符,以便判断两个对象是否“相等”。如此依赖,你的类才会变得真的与基本数据类型相似。

阅读更多

ubuntu使用shadowsocks

1
$sudo apt-get install privoxy

安装完后进行配置,其配置文件在/etc/privoxy/config
找到# forward-socks5t / 127.0.0.1:9050 .
把它改成 forward-socks5 / 127.0.0.1:1080 .
并且删掉前面的#注释,中间的t和结尾的9050改成1080
1.png
配置完成,重启privoxy:

1
$sudo /etc/init.d/privoxy restart

随后进入系统设置 -> 网络 -> 网络代理 -> 方法:手动 -> HTTP代理:127.0.0.1 8118
修改完成后点击应用到整个系统即可。
2.png

c++学习记录二:构造函数

(本文来自《c++简明教程》)
##构造函数入门
构造函数(constructor)是c++用于描述“初始化函数”的一个术语,这种函数告诉编译器如何解释下面这样的声明:
Fraction a(1, 2); // a = 1/2
基于前面介绍过的有关Fraction类的知识,你或许已经猜到,这个声明等价于以下语句:

阅读更多

截图工具shutter的配置

安装:

1
$sudo apt-get install shutter

Ubuntu16.04设置方式

添加截图快捷键:
系统设置->键盘->快捷键->自定义快捷键
然后点击右侧禁用然后在键盘上输入快捷键即可


Ubuntu18.04设置方式

设置->设备->键盘->快捷键区域点击+号(拉到底部),设置名称,设置命令:shutter -s,设置键盘快捷键。

image-20210506221335573