2014-05-17 23:58:58 oyangyufu 阅读数 916

1、下载bmfont工具

地址:http://www.angelcode.com/products/bmfont/

 

2、安装启动,,右边为字体库,可根据需要选择

 

3、选中所需要所字符,配置“Options->Export Options”, 弹出设置选项,配置生成fnt文件及png图片:

 

3、生成了.fnt 和.png文件,copy至工程Resources目录下,添加测试代码:

CCLabelBMFont *bm = CCLabelBMFont::create("789512", "1.fnt");
bm->setPosition(ccp(visibleSize.width/2, visibleSize.height/2));
this->addChild(bm);


4、运行


 

 

 

2018-11-20 22:59:46 TheKingOfSaltlyFish 阅读数 27

   C语言提供了很多操作符,种类繁多,不易掌握,下面总结了一些C语言的常见操作符及其用法。

操作符

  操作符按功能可划分为:算术操作符移位操作符位操作符赋值操作符关系操作符逻辑操作符条件操作符逗号操作符等。

  1. 算术操作符: + - *  / %
      C语言提供了很多常见的算术操作符,分别是  + - * / % 需要注意的是:
       其中 “ / ” 在进行运算时,如果 / 两边都是整数,则执行整除运算(运算结果向下取整),其他情况执行的是浮点数运算(运算结果保留小数)。
      % 是取模操作符,也叫求余操作符,此操作符左右两边可以接受整型操作数,它会将左边的操作数除以右边的操作数,将余数作为结果。

  2. 移位操作符:<< 左移、 >> 右移
      在计算机中,数据都用二进制来存储,对一个数字而言,这里的“移位”是针对这个数在二进制下的表示形式而言的。
      << 左移操作符会把操作符左边的值的位向左移动操作符右边数字个位数,例如:3 << 2,意思是把3的二进制:0000 0011左移二位变成0000 1100而移位后的二进制数转换为十进制表示为12,类似的,左移操作相当于把操作符左边的数乘以2的n次方,n是操作符右边的数。
      并且左移操作符在移位时,会将二进制表示的左边超出的位舍弃,右边缺少的补0.
    左移操作
      >> 右移操作符与左移操作符不同,左移操作符是逻辑移位,而右移操作符是算术移位,二者的差别在于,前者溢出位舍弃,缺少的位补零,后者溢出位舍弃,缺少的位补充有两种情况,若左边的操作数是正数则补零,反之则补一。
      类似的,右移操作相当于把操作符左边的数除以2的n次方。

  3. 位操作符: & | ^
      & 按位与操作:当两个位进行按位与操作时,若两个位都是1则结果为1,其中至少一个不为1结果为0。
      | 按位或操作:当两个数进行按位或操作时,若两个位都是0则结果为0,其至少一个为1则结果为1。
      ^ 按位异或操作:当两个数进行按位异或操作时,若两个位不相同则结果为1,反之则为0。
      

  4. 赋值操作符: =
      赋值操作符是一个等号。它会把操作符右边的值存储到操作符左边的操作数指定的位置。
      赋值操作符的求值顺序是从右到左,举个例子:
      a = b = c + 1;
      相当于:b = c + 1 ;
          a = b;
      赋值操作符和其他操作符搭配使用,可以形成一种新的形式——复合赋值符:
    += -= *= /= %= <<= >>= &= |= ^=
      这些复合赋值符可以使代码变得紧凑,甚至在一些特殊情况下会有更高的执行效率。例子:
      a = a + 1;等价于a += 1;

  5. 关系操作符:> >= < <= != 不等于 == 等于
      关系操作符用来判断两端操作数的关系,如果两端操作数符合指定操作符所表达的关系,则表达式的结果为1,反之则为0,需要注意的是关系操作符的结果是整型值,并非布尔类型(ture/false)。

  6. 逻辑操作符:&& || !
      !操作符意思是对它右边的表达式逻辑取反,即!右边的表达式为真则结果为假,反之结果为真。
      逻辑操作符&&用来测试操作符两边表达式的真假,它的工作原理是:先对它左边的表达式求值,如果左边表达式值为真,紧接着对右边的表达式求值。如果它左边的表达式值为假,则不对右边的表达式求值。
      逻辑操作符||的工作原理类似:先对操作符左边的表达式求值,如果左边表达式为真,则不对右边求值,如果左边表达式为假,紧接着对右边求值。
      这个行为被称为“短路求值”。

  7. 条件操作符:expression1 ? expression2 : expression3
      条件操作符接受三个操作数,并且优先级最低,一般不加括号也没有问题,但是为了增加可读性,人们普遍会添加括号。
      对于条件操作符,首先会计算expression1的值,如果表达式结果为真,则整个表达式的值就是expression2的值,并且不计算expression3的值,反之整个表达式就是expression3的值,并且不计算expression2的值。

  8. 逗号操作符:,
      逗号操作符把表达式分割开来,从左到右依次求值,整个表达式的值就是最后那个表达式的值

  9. 下标引用 :数组[下标]
      下标引用常见于数组访问下标的操作,[]操作符接受两个操作数,一个数组名(指针)和一个下标(整数),C语言的下标值从0开始,并且不会对下标是否有效进行检查,因此在操作时要小心仔细。

2017-06-20 13:49:41 sinat_35512245 阅读数 571

在我们初学Java时,可能会经常碰到下面的代码:

这里写图片描述

运行结果如下:

这里写图片描述

  也许你会很困惑,为什么输出结果不一样?==和equals方法之间的区别是什么?如果在初学Java的时候这个问题不弄清楚,就会导致自己在以后编写代码时出现一些低级的错误。今天就来一起了解一下==和equals方法的区别之处。

一.关系操作符“==”到底比较的是什么?

  下面这个句话是摘自《Java编程思想》一书中的原话:

关系操作符生成的是一个boolean结果,它们计算的是操作数的值之间的关系”。

  在Java中拥有8种基本数据类型:

浮点型:float(4 byte), double(8 byte)
整型:byte(1 byte), short(2 byte), int(4 byte) , long(8 byte)
字符型: char(2 byte)
布尔型: boolean(JVM规范没有明确规定其所占的空间大小,仅规定其只能够取字面值”true”和”false”)

  对于这8种基本数据类型的变量,变量直接存储的是“值”,因此在用关系操作符==来进行比较时,比较的就是 “值” 本身。要注意浮点型和整型都是有符号类型的,而char是无符号类型的(char类型取值范围为0~2^16-1)。
  也就是说比如:

int n=3;
int m=3; 

  变量n和变量m都是直接存储的”3”这个数值,所以用==比较的时候结果是true。

  而对于非基本数据类型的变量,在一些书籍中称作为 引用类型的变量。比如上面的str1就是引用类型的变量,引用类型的变量存储的并不是 “值”本身,而是于其关联的对象在内存中的地址。比如下面这行代码:  

 String str1;

  这句话声明了一个引用类型的变量,此时它并没有和任何对象关联。而通过new String(“hello”)来产生一个对象(也称作为类String的一个实例),并将这个对象和str1进行绑定:  

 str1= new String("hello");

  那么str1指向了一个对象(很多地方也把str1称作为对象的引用),此时变量str1中存储的是它指向的对象在内存中的存储地址,并不是“值”本身,也就是说并不是直接存储的字符串”hello”。这里面的引用和C/C++中的指针很类似。
  因此在用==对str1和str2进行第一次比较时,得到的结果是false。因此它们分别指向的是不同的对象,也就是说它们实际存储的内存地址不同。
  而在第二次比较时,都让str1和str2指向了str指向的对象,那么得到的结果毫无疑问是true。

总结来说:

1)对于==,如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;如果作用于引用类型的变量,则比较的是所指向的对象的地址。
2)对于equals不能作用于基本数据类型的变量(如:不能写成 int m=1;int n=1;n.equals(m);)如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。

2019-10-23 12:02:28 ZxxSteven 阅读数 10

3. JavaScript数组

3.1 数组常用方法

  • map: 遍历数组,返回回调函数返回值组成的新数组,不改变原数组
  • forEach:无法break,可以用try/catch中throw new Error来停止
  • filter:过滤
  • some:有一项返回true,则整体为true
  • every:有一项返回false,则整体为false
  • join:通过指定连接符生成字符串
  • push / pop:末尾推入和弹出,改变原数组, 返回推入/弹出项
  • unshift / shift:头部推入和弹出,改变原数组,返回操作项
  • sort(fn) / reverse:排序与反转,改变原数组
  • concat:连接数组,不影响原数组, 浅拷贝
  • slice(start, end):返回截断后的新数组,不改变原数组
  • splice(start, number, value):返回删除元素组成的数组,value为插入项,改变原数组
  • indexOf / lastIndexOf(value, fromIndex):查找数组项,返回对应的下标
  • reduce / reduceRight(fn(prev, cur), defaultPrev):两两执行,prev 为上次化简函数的return值,cur为当前值(从第二项开始)

3.2 判断数组

  • instanceof 方法
    • instanceof 运算符是用来判断一个对象的原型链中是不是能找到类型的 prototype
    var arr = [];
    arr instanceof Array; // true
    
  • constructor 方法

    constructor属性返回对创建此对象的数组函数的引用,就是返回对象相对应的构造函数

    var arr = [];
    arr.constructor == Array; // true
    
  • isArray() 方法
    var a = new Array(123);
    var b = new Date();
    console.log(Array.isArray(a)); // true
    console.log(Array.isArray(b)); // false
    
  • Object.prototype.toString.call()

    这个在之前讲判断数据类型的文章里说过,这里不再赘述。

3.3 数组的遍历

  • map和forEach的区别
    • map具有返回值,返回一个新的数组,不修改原数组;
      forEach没有返回值,直接修改原数组
    • 从性能上来说,forEach的性能要略好于map。
      测试例子请狠狠点击这里
  • JavaScript数组和对象的遍历方式,以及几种方式的比较

    通常我们会用循环的方式来遍历数组。但是循环是 导致js 性能问题的原因之一。一般我们会采用下几种方式来进行数组的遍历

    • for in循环
    • for循环
    • forEach
      • 这里的 forEach回调中两个参数分别为 value,index
      • forEach 无法遍历对象
      • IE不支持该方法;Firefox 和 chrome 支持
      • forEach 无法使用 break,continue 跳出循环,且使用 return 是跳过本次循环
    • 这两种方法应该非常常见且使用很频繁。但实际上,这两种方法都存在性能问题
    • 在方式一中,for-in需要分析出array的每个属性,这个操作性能开销很大。用在 key 已知的数组上是非常不划算的。所以尽量不要用for-in,除非你不清楚要处理哪些属性,例如 JSON对象这样的情况
    • 在方式2中,循环每进行一次,就要检查一下数组长度。读取属性(数组长度)要比读局部变量慢,尤其是当 array 里存放的都是 DOM 元素,因为每次读取都会扫描一遍页面上的选择器相关元素,速度会大大降低
    • ES6新增的 for of 循环。for in循环通常用来遍历对象的Key,for of通常用来遍历对象的Value。

3.4 数组去重

  • 利用双重循环去判断。声明一个空数组,然后遍历原数组,从原数组第一个元素开始往新的数组中放,如果没有该值,则push进去,否则跳过,最后返回新数组。实现数组去重。
  • 使用ES的Set集合。
    Set集合的特性之一是其集合中没有重复的元素,因此可以利用这一特性来实现数组去重的目的。举例:
var array2 = [...new Set([1,2,3,3,3,4,5])];
console.log(array2); // Array(5) [ 1, 2, 3, 4, 5 ]

3.5 数组乱序

  • 思路:使用sort()排序,或者使用洗牌算法。
  • 实现:
    • 创建一个数组
    let arr = Array(100000).fill(0).map((item, index) => index + 1);
    
      1. 直接利用sort进行排序,有漏洞,大部分元素位置没有移动
    arr.sort((a, b) => (Math.random() > 0.5 ? -1 : 1));
    console.log(arr);
    
      1. 经典洗牌算法实现
    function shuffle(array) { 
        let arrayLength = array.length,   
            randomIndex, //随机数   
            tempItem; //临时存储元素  
        for (let i = arrayLength - 1; i >= 0; i--) {    
            randomIndex = Math.floor(Math.random() * (i + 1));    
            tempItem = array[randomIndex];    
            array[randomIndex] = array[i];    
            array[i] = tempItem;  
        }  
        return array;
    }
    console.log(shuffle(arr));
    

3.6 数组的扁平化(数组降维/多维转一维)

3.6.1 概念

数组的扁平化是指将一个多为数组变为一维数组。例如:

[1, [2, 3, [4, 5]]] ------> [1, 2, 3, 4, 5]

3.6.2 实现

  • ES10 数组新特性: Array.prototype.flat()方法

    flat()方法按照一个可以指定的嵌套深度的参数来递归遍历数组,并将所有元素以及遍历到的子数组里面的元素合并返回一个新数组。

    var arr = [true, function(){}, [{}, [2]]];
    var newArr = arr.flat(2);
    console.log(newArr); //  [true, ƒ, {…}, 2]
    
  • 递归。如下:
    function flatten(arr) {
        var res = [];
        arr.map(item => {
            if(Array.isArray(item)) {
                res = res.concat(flatten(item));
            } else {
                res.push(item);
            }
        });
        return res;
    }
    
  • 扩展运算符
    function flatten(arr) {
        while(arr.some(item=>Array.isArray(item))) {
            arr = [].concat(...arr);
        }
        return arr;
    }
    
  • reduce

    使用数组的reduce方法,遍历数组中的每一个项,如果某一项是数组,则继续遍历,否则concat(连接数组);
    举例:

    function flatten(arr) {  
        return arr.reduce((result, item)=> {
            return result.concat(Array.isArray(item) ? flatten(item) : item);
        }, []);
    }
    var arr = [false, function(){}, [{}, [2]]];
    var arr2 = [1, [2,3],4,[5,[6,7]]];
    var newArr = flatten(arr); 
    var newArr2 = flatten(arr2);
    console.log(newArr); // [false, ƒ, {…}, 2]
    console.log(newArr2); // [1, 2, 3, 4, 5, 6, 7]
    

3.6.3 总结

实现数组扁平化的方法有很多,但是最核心的一点就是,遍历数组,拿到数组的每一项,如果是数组,再继续遍历,直到每一项不再是数组则停止。然后将这些项放到一个新的数组,最后将这个数组返回。数组降维,或者多维转一维都和数组扁平化是一个道理。


参考链接:
http://blog.poetries.top/FE-Interview-Questions/review/#_23-%E6%95%B0%E7%BB%84-array
https://www.cnblogs.com/chris-oil/p/8743509.html
https://www.cnblogs.com/owenzh/p/11058708.html https://juejin.im/post/5d391d336fb9a07ebe750343https://juejin.im/post/59716f15f265da6c4c500fc7
https://juejin.im/post/5adc8e396fb9a07aa0479725 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flat

没有更多推荐了,返回首页